




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机专业软件类课程实验报告课程名称:编译原理实验题目:中缀表达式转后缀表达式计算器实验小组成员:陈红实验小组组长:陈红任课教师:杜老师专业名称:计算机师范班级名称:10计算机师范实验起止时间:注:整个实验报告内容,仅第九点是任课教师填写,其他各项都必须有实验小组人员填写。一、 实验目的1. 要求设计交互界面,能输入能转换能输出,形式和风格自定。2. 将一个中缀表达式转换成相应的后缀表达式,即将运算对象写在前面,把运算符号写在后面,从而易于计算机的处理,并以此做成一个计算器,要求能得出计算结果。二、实验内容1.中后缀转换计算器交互界面的设计2.中后缀转换的源代码的编写以及将该代码导入交互界面使交互界面能输入能转换能输出。并设置界面中每个控件的click事件下添加相应代码,赋予其相应功能。三、实验需求(需要实现哪些功能)要求制作一个计算器,在中缀表达式一栏输入一个中缀表达式,点击相应按钮能够将其转换成后缀表达式显示出来并能计算出表达式的结果。四、主要数据结构介绍1. 主要思想:(1)若取出的字符是数字,则分析出完整的运算数,该运算数直接送入S2栈 (2)若取出的字符是运算符,则将该运算符与S1栈栈顶元素比较,如果该运算符优先级大于S1栈栈顶运算符优先级,则将该运算符进S1栈,否者,将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符低于(不包括等于)该运算符优先级,则将该运算符送入S1栈。 (3)若取出的字符是“(”,则直接送入S1栈栈顶。 (4)若取出的字符是“)”,则将距离S1栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入S2栈,此时抛弃“(”。 (5) 重复上面的14步,直至处理完所有的输入字符 (6)若取出的字符是“#”,则将S1栈内所有运算符(不包括“#”),逐个出栈,依次送入S2栈。 完成以上步骤,S2栈便为后缀表达式输出结果。不过S2应做一下逆序处理。便可以按照后缀表达式的计算方法计算了!2.主要模块结构:(1)q1队列存放了输入的表达式 ,即中缀表达式,q2存放的是后缀表达式 privatevoidbt_Click(objectsender,EventArgse)if(s!=null)q1.In(s);while(!q1.IsEmpty()/如果q1不为空时stringstr=Convert.ToString(q1.O ut();if(str.Length=1&isoperator(Convert.ToChar(str)if(str=a)s1.Push(str);continue;if(str=b)while(!s1.IsEmpty()&Convert.ToString(s1.GetTop()!=a)q2.In(s1.Pop();s1.Pop();continue;if(priority(Convert.ToChar(str)priority(Convert.ToChar(s1.GetTop()/如果扫描到的运算符优先级大于s1栈顶运算符优先级s1.Push(str);/MessageBox.Show(大于);elsewhile(!s1.IsEmpty()&priority(Convert.ToChar(s1.GetTop()priority(Convert.ToChar(str)q2.In(s1.Pop();s1.Push(str);/MessageBox.Show(扫描到的小于栈顶);elseq2.In(str);while(!s1.IsEmpty()q2.In(s1.Pop();(2)下面是对优先级赋值的函数方法:(就是a,其优先级最低,cd代表乘和除,优先级高于+-,所以返回值大。哪些数字按钮和+-*/按钮的最终目的就是把中缀表达式输入q1int priority(char op) switch (op) case a: return 0; case +: case m: return 1; case c: case d: return 2; default: return -1; 五、主要模块算法介绍1.在form1主窗体中添加一个form6,在逆波兰记号下new一个form6 private void 逆波兰记号ToolStripMenuItem_Click(object sender, EventArgs e) Form6 f6 = new Form6(); f6.Show(); f6.TopMost = true; this.Activate(); 2.下面是form6即中后缀转换界面各控件的事件代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace 编译原理1 public partial class Form6 : Form public Form6() InitializeComponent(); private void Form6_Load(object sender, EventArgs e) MyStack s1 = new MyStack(100);/转换后缀时放运算符的栈 MyStack stack2 = new MyStack(100);/用来计算后缀表达式的栈存放数字然后弹出计算 Queue q2 = new Queue(100); /队列 Queue q1 = new Queue(100); /队列 string s = null;/用来临时储存输入时的数字和运算符然添加到队列 /bool isoperator(char op); / 判断是否为运算符 /int priority(char op); / 求运算符优先级 /void postfix(char pre , char post,int n); / 把中缀表达式转换为后缀表达式 /double read_number(char str,int *i); / 将数字字符串转变成相应的数字 /double postfix_value(char post); / 由后缀表达式字符串计算相应的中值表达式的值 bool isoperator(char op) switch (op) case a: case b: case +: case m: case c: case d: return true; default: return false; int priority(char op) switch (op) case a: return 0; case +: case m: return 1; case c: case d: return 2; default: return -1; private void button1_Click(object sender, EventArgs e) /q1.In(-); /char c=Convert.ToChar(q1.Out(); /if (isoperator(c) textBox1.Text = textBox1.Text + 1; s = s + 1; /s1.Push(2); /s1.Push(3); /textBox1.Text = Convert.ToString(s1.Pop() + Convert.ToString(s1.Pop(); private void button2_Click(object sender, EventArgs e) textBox1.Text = textBox1.Text + 2; s = s + 2; private void button3_Click(object sender, EventArgs e) textBox1.Text = textBox1.Text + 3; s = s + 3; private void button4_Click(object sender, EventArgs e) textBox1.Text = textBox1.Text + 4; s = s + 4; private void button5_Click(object sender, EventArgs e) textBox1.Text = textBox1.Text + 5; s = s + 5; private void button6_Click(object sender, EventArgs e) textBox1.Text = textBox1.Text + 6; s = s + 6; private void button7_Click(object sender, EventArgs e) textBox1.Text = textBox1.Text + 7; s = s + 7; private void button8_Click(object sender, EventArgs e) textBox1.Text = textBox1.Text + 8; s = s + 8; private void button9_Click(object sender, EventArgs e) textBox1.Text = textBox1.Text + 9; s = s + 9; private void button0_Click(object sender, EventArgs e) textBox1.Text = textBox1.Text + 0; s = s + 0; private void buttonL_Click(object sender, EventArgs e) textBox1.Text = textBox1.Text + (; q1.In(a); private void buttonR_Click(object sender, EventArgs e) textBox1.Text = textBox1.Text + ); if (s != null) q1.In(s); s = null; q1.In(b); private void buttonP_Click(object sender, EventArgs e) textBox1.Text = textBox1.Text + +; if (s != null) q1.In(s); s = null; q1.In(+); private void buttonM_Click(object sender, EventArgs e) textBox1.Text = textBox1.Text + -; if (s != null) q1.In(s); s = null; q1.In(m); private void buttonML_Click(object sender, EventArgs e) textBox1.Text = textBox1.Text + ; if (s != null) q1.In(s); s = null; q1.In(c); private void buttonD_Click(object sender, EventArgs e) textBox1.Text = textBox1.Text + /; if (s != null) q1.In(s); s = null; q1.In(d); private void bt_Click(object sender, EventArgs e) if (s != null) q1.In(s); while (!q1.IsEmpty()/如果不为空时 string str = Convert.ToString(q1.Out(); if (str.Length = 1 & isoperator(Convert.ToChar(str) if (str = a) s1.Push(str); continue; if (str = b) while (!s1.IsEmpty() & Convert.ToString(s1.GetTop() != a) q2.In(s1.Pop(); s1.Pop(); continue; if (priority(Convert.ToChar(str) priority(Convert.ToChar(s1.GetTop()/如果扫描到的运算符优先级大于栈顶运算符优先级 s1.Push(str); / MessageBox.Show(大于); else while (!s1.IsEmpty() & priority(Convert.ToChar(s1.GetTop() priority(Convert.ToChar(str) q2.In(s1.Pop(); s1.Push(str); / MessageBox.Show(扫描到的小于栈顶); else q2.In(str); while (!s1.IsEmpty() q2.In(s1.Pop(); while (!q2.IsEmpty() string s2 = Convert.ToString(q2.Out(); /*if (s2 = a) textBox2.Text = textBox2.Text + (; s2 = ; if (s2 = b) textBox2.Text = textBox2.Text + ); s2 = ; */ if (s2 = +) textBox2.Text = textBox2.Text + +; stack2.Push(Convert.ToUInt32(stack2.Pop() + Convert.ToUInt32(stack2.Pop(); continue; if (s2 = m)/即减号 textBox2.Text = textBox2.Text + -; uint i = Convert.ToUInt32(stack2.Pop(); uint j = Convert.ToUInt32(stack2.Pop(); int k = Convert.ToInt32(j - i); stack2.Push(k); continue; if (s2 = c)/即乘号 textBox2.Text = textBox2.Text + ; stack2.Push(Convert.ToUInt32(stack2.Pop() * Convert.ToUInt32(stack2.Pop(); continue; if (s2 = d)/即除号 textBox2.Text = textBox2.Text + /; uint i = Convert.ToUInt32(stack2.Pop(); uint j = Convert.ToUInt32(stack2.Pop(); int k = Convert.ToInt32(j / i); stack2.Push(k); continue; stack2.Push(s2); textBox2.Text = textBox2.Text + s2; textBox3.Text = Convert.ToString(stack2.Pop(); private void button归零_Click(object sender, EventArgs e) s1.ClearStack(); q1.ClearQueue(); q2.ClearQueue(); s = null; textBox1.Text = null; textBox2.Text = null; textBox3.Text = null; private void label1_Click(object sender, EventArgs e) 3. 下面是自定义的一个栈和队列,用来完成串中运算符和数字的进出,最终完成转换,栈作为一个中介,最后真正用到的是队列。3.Mystack代码如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 编译原理1 class MyStack int maxsize; /顺序栈的容量 object data; /数组用于存储栈中的数据 int top; /指示栈顶 public object thisint index get return dataindex; set dataindex = value; /栈容量属性 public int Maxsize get return maxsize; set maxsize = value; /获得栈顶元素属性 public int Top get return top; /使用构造器初始化栈 public MyStack(int size) data = new objectsize; maxsize = size; top = -1; /求栈的长度(栈中的元素个数) public int StackLength() return top + 1; /清空顺序栈 public void ClearStack() top = -1; /判断顺序栈是否为空 public bool IsEmpty() if (top = -1) return true; else return false; /判断顺序栈是否为满 public bool IsFull() if (top = maxsize - 1) return true; else return false; /入栈操作 public void Push(object e) if (IsFull() Console.WriteLine(栈已满!); return; data+top = e; /出栈操作并返回出栈的元素 public object Pop() object temp = null; if (IsEmpty() Console.WriteLine(栈为空!); return temp; temp = datatop; top-; return temp; /获取栈顶元素 public object GetTop() if (IsEmpty() return null; return datatop; 4.Queue的代码如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 编译原理1 class Queue object data; /数据元素 int maxsize; /最大容量 int front; /指向队头 int rear; /指向队尾 /初始化队列 public Queue(int size) this.maxsize = size; data = new objectsize; front = rear = -1; /最大容量属性 public int MaxSize get return this.maxsize; set this.maxsize = value; /队尾属性 public int Rear get return this.rear; /队头属性 public int Front get return this.front; /数据属性 public object thisint index get return dataindex; /获队列的长度 public int GetQueueLength() return rear - front; /判队列是否满 public bool IsFull() if (GetQueueLength() = maxsize) return true; else return false; /判断队列是否为空 public bool IsEmpty() if (rear = front) return true; else return false; /清空队列 public void ClearQueue() rear = front = -1; /入队 public void In(object e) if (IsFull() return; data+rear = e; /出队 public object Out() if (IsEmpty() return null; if (rear - front 0) object tmp = data+front; return
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年营养师基础知识考核试卷:营养师专业能力综合评估试题
- 2025年护士执业资格考试题库-妇产科护理学专项护理效果评价试题
- 2025年医保知识考试题库及答案:医保信息化建设应用信息安全试题
- 2025年人力资源管理师专业技能考核试卷:人力资源规划与战略管理试题型
- 2025年高压电工技师职称考试:高压设备故障诊断与事故处理试题型
- 2025年教师资格考试《综合素质》教育教学能力提升模拟试题及答案
- 2025年中学教师资格考试《综合素质》教育教学能力教师教学风格试题型(含答案)
- 2025年安全生产考试题库(机械安全操作规范)实战试题解析
- 2025年室内设计师职业资格考试真题模拟卷-家具设计与应用试题
- Unit 3 Get off the bed!说课稿小学英语Starter B新概念英语(青少版)
- 辐射安全防护技术革新方案
- 2025年大学生人文知识竞赛题库及参考答案
- 高考集合考试题及答案
- 中秋团圆主题班会课件
- 潍坊市辅警考试题库2025
- 飞行服务站2025年无人机培训基地建设与发展报告
- 2025年福建农业行政执法资格考试(专业法律知识)历年参考题库含答案详解
- 新质生产力六大科创中心
- 医疗数据孤岛问题与跨平台安全共享策略-洞察及研究
- 2025年有机食品消费者购买行为与偏好研究报告
- 2025年迎中秋节庆国庆节主题班会课件
评论
0/150
提交评论