




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、北京邮电大学信息与通信工程学院数据结构实验报告实验名称: 实验4栈的应用学生姓名: 班 级: 班内序号: 15学 号: 日 期: 2015年12月28日1 实验要求表达式求值是程序设计语言编译中最近本的问题,它要求把一个表达式翻译成能够直接求值的序列。例如用户输入字符串“14+(13-2)*2-11*5)*2”,程序可以自动计算得到最终的结果。在这里,我们将问题简化,假定算数表达式的值均为非负整数常数,不包含变量、小数和字符常量。试设计一个算术四则运算表达式求值的简单计算器。基本要求:1、 操作数均为非负整数常数,操作符仅为+、-、*、/、(和);2、 编写main函数进行测试。2.1 存储结
2、构 顺序栈: int型数字栈 char型字符栈/*-+121 Top=-1 Top=-1 2.2 关键算法分析1.判断输入字符是否为运算符int IsOpr(char c) /判断输入字符是否为运算符 if (c='+'|c='-'|c='*'|c='/'|c='('|c=')'|c='#') return 1; else return 0; 2. 判断字符的优先级将判断条件分为多种情况:如果栈顶元素是+、-的情况与刚取得的字符大小比较如果是+、-则返回>,如果是*、/则返回&
3、lt;,如果是左括号则返回<,如果是右括号则返回>,其他情况则返回>如果栈顶元素是*、/的情况与刚取得的字符大小比较如果是+、-则返回>,如果是*、/则返回>,如果是左括号则返回<,如果是右括号则返回>,其他情况则返回>如果栈顶元素是(的情况与刚取得的字符大小比较,除了右括号是=以外,其他都是返回<如果栈顶元素是)的情况与刚取得的字符大小比较,都是返回>如果栈顶元素是#的情况与刚取得的字符大小比较,除了#返回=以外,其他都是返回>这个方法即将中序表达式转换为后缀表达式char Precede(char s,char c) /判断
4、字符的优先级 switch(s) case '+': case '-': if(c='+'|c='-') return '>' else if (c='*'|c='/') return '<' else if(c='(') return '<' else if(c=')') return '>' else return '>' break; case '
5、;*': case '/': if(c='+'|c='-') return '>' else if (c='*'|c='/') return '>' else if(c='(') return '<' else if(c=')') return '>' else return '>' break; case '(': if(c=')')
6、 return '=' else return '<' break; case ')': return '>' break; case '#': if(c='#') return '=' else return '<' break; 3.计算int Operate(int x,char opr,int y) /计算 int result; switch (opr) case '+': result = x + y; break; ca
7、se '-': result = x - y; break; case '*': result = x * y; break; case '/': result = x / y; break; return result; 3. 程序运行结果程序运行图开始 定义数字栈S1符号栈S2输入字符串S读取字符SjSj!=0 N YSj是计算符号? NS1.push(sj) Y与栈顶符号比较优先级结束循环J+输出S1.POP><Theta=S2.pop ( )=S2.pop ( )S2.push(sj)结束a=S1.pop ( )J+J+b=S
8、1.pop ( )计算(a,theta,b)S1.push(结果)源代码:#include<iostream>#include<string>using namespace std;const int Max=128;template<class T>class Stackpublic:Stack()top=-1;void Push(T x); /入栈T Pop(); /进栈T GetTop(); /取栈顶元素int isEmpty(); /判断栈是否为空private:int top;T dataMax;template<class T>voi
9、d Stack<T>:Push(T x)if(top>=Max-1) throw "上溢"top +;datatop=x;template<class T>T Stack<T>:Pop()if(isEmpty() throw "下溢"top-;return datatop+1;template<class T>T Stack<T>:GetTop()if(isEmpty()throw "下溢"return datatop;template<class T>in
10、t Stack<T>:isEmpty()if(top=-1)return 1;elsereturn 0;int IsOpr(char c); /判断输入字符是否为运算符 char Precede(char s,char c); /判断字符的优先级 int Operate(int x,char opr,int y); /计算 int IsOpr(char c) /判断输入字符是否为运算符 if (c='+'|c='-'|c='*'|c='/'|c='('|c=')'|c='#
11、9;) return 1; else return 0; char Precede(char s,char c) /判断字符的优先级 switch(s) case '+': case '-': if(c='+'|c='-') return '>' else if (c='*'|c='/') return '<' else if(c='(') return '<' else if(c=')') retur
12、n '>' else return '>' break; case '*': case '/': if(c='+'|c='-') return '>' else if (c='*'|c='/') return '>' else if(c='(') return '<' else if(c=')') return '>' else retu
13、rn '>' break; case '(': if(c=')') return '=' else return '<' break; case ')': return '>' break; case '#': if(c='#') return '=' else return '<' break; int Operate(int x,char opr,int y) /计算 int result;
14、switch (opr) case '+': result = x + y; break; case '-': result = x - y; break; case '*': result = x * y; break; case '/': result = x / y; break; return result; void main()Stack<int> s1;/运算数栈Stack<char> s2;/运算符栈s2.Push('#');int a,b,result,i,n,j=0; c
15、har theta;string s;cout<<"请输入算式,出入#号结束"<<endl;cin>>s;while(sj!='0')if(!IsOpr(sj) /是运算数的情况 i=sj-'0'/将字符型转为整型j+; while(!IsOpr(sj) /使得可以输入几位数 n=sj-'0'i=i*10+n;j+; s1.Push(i); else switch(Precede(s2.GetTop(),sj) /比较栈顶运算符和刚输入运算符的优先级 case '<':
16、 s2.Push(sj); j+; break; case '=': theta=s2.Pop(); j+;break; case '>': theta=s2.Pop(); b=s1.Pop(); a=s1.Pop(); result=Operate(a,theta,b); s1.Push(result); break; cout<<s1.GetTop()<<endl;4. 总结这次的实验选了题目四,用栈做计算器,在写之前一直觉得这是一个很简单的实验,主要是在网上看到栈做计算器的想,所以觉得应该没什么难度,但是真正做起来才发现难上加难。尤其是在做中缀转成后缀的时候,其实这个本来有个想法是用树来做,中缀表达式是树的中序遍历(当然要注意运算符的优先级),而后缀表达式是树的后序遍历,最初的想法是将中缀表达式转化成为树,然后对树做后序遍历就能得到后缀表达式,但是此次实验是以栈、队
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年旬阳县数学三上期末检测试题含解析
- 七年级 生物学绪论1课件
- 理论结合实践的卫生资格考试试题及答案
- 明晰2025年大学语文考试知识框架试题及答案
- 自考行政管理对策研究试题及答案
- 助力行政法学考试试题与答案
- 2025年执业药师复习计划试题及答案
- 综合解析经济法概论试题及答案
- 行政法学现场案例试题及答案
- 行政管理专科语文考核试题及答案
- 2025年海淀高三二模语文试题及答案
- 1.基本部位操第一~四节 (2)
- 06竣工财务决算审计工作底稿(试行)
- 工伤保险医疗费用智能审核系统建设
- 实验--验证动量守恒定律优秀课件
- 钢结构楼梯施工方案
- 剑桥少儿英语一级上册Unit1-8测试卷
- 工程建设领域廉政风险防范示意图
- 豌豆上公主PPT课件
- 艾滋病防治条例PPT课件
- 学生入团申请推荐表
评论
0/150
提交评论