中缀表达式转后缀表达式求值
来源:互联网 发布:kerberos源码 编辑:程序博客网 时间:2024/05/21 08:03
中缀表达式转后缀表达式是数据结构栈和队列很好的应用例子。难点主要就在于如何将中缀表达式转换为后缀表达式的问题上。下面就是转换的规则和需要注意的地方。
首先需要开一个栈和队列。栈用作临时的存储空间。队列则用于存放最终的后缀表达式。
中缀表达式转后缀表达式的规则:
1.开始在栈中压入一个#。然后从中缀表达式的左边开始遍历,如果遇到数字直接放入队列。如果是操作符则和栈顶比较,如果优先级大于栈顶则入栈,否则将栈顶压入队列并将当前操作符入栈。
2.如果遇到'('。则无条件入栈不用和栈顶进行比较。
3.如果遇到')'。不用入栈,从栈顶开始将栈内元素弹出并压入队列中,直到遇到'('。将'('弹出栈。
后缀表达式运算规则:需要设立一个栈用于存放计算结果。
1.从队列中取元素,如果是操作数直接出队入栈。
2.如果是运算符则出队,并且弹出栈的两个元素运算并将运算结果压入栈内。直到队列为空。
#include <iostream>#include <stack>#include <queue>using namespace std;stack<char>s;queue<char>q;int Operator(char ch){ switch(ch) { case '+': case '-': case '*': case '/': case '(': case ')': case '#': return 1; default: return 0; }}int priority(char ch){ switch(ch) { case '+': case '-': return 1; case '*': case '/': return 2; case '#': return -1; case '(': return 0; }}double caculate(double a,char ch,double b){ switch(ch) { case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; } }void change(char *ch){ s.push('#'); int i = 0; while (ch[i] != '#') { if (!Operator(ch[i])) { q.push(ch[i]); i++; } else { if (ch[i] == '(') { s.push(ch[i]); i++; } else if (ch[i] == ')') { while (s.top() != '(') { q.push(s.top()); s.pop(); } s.pop(); i++; } else { if (priority(ch[i]) > priority(s.top())) { s.push(ch[i]); i++; } else { q.push(s.top()); s.pop(); s.push(ch[i]); i++; } } } } /*将剩余的栈内的元素弹出栈存在队列中*/ while (s.top() != '#') { q.push(s.top()); s.pop(); }}double result(){ stack<double>s; while (!q.empty()) { if (!Operator(q.front())) { s.push(q.front()-48); q.pop(); } else { double b = s.top(); s.pop(); double a = s.top(); s.pop(); char ch = q.front(); s.push(caculate(a,ch,b)); q.pop(); } } cout << s.top() << endl;}int main(){ char c[10]; gets(c); change(c); result(); system("pause"); return 0;}
- 中缀表达式求值、后缀表达式求值、中缀转后缀、前缀
- 中缀 后缀表达式求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式 求值
- 中缀转后缀 和 后缀表达式求值
- NYOJ 35 表达式求值 【中缀转后缀+后缀表达式求值】
- 表达式求值(中缀转后缀及后缀表达式求值)
- 中缀表达式转后缀表达式 以及 后缀表达式求值
- 后缀表达式求值及中缀表达式转后缀表达式
- 中缀转后缀及表达式求值
- 中缀表达式转后缀并求值
- 中缀表达式转后缀,以及后缀表达式的求值
- java算术表达式求值-中缀表达式转后缀表达式
- 关于对时间的处理 (我自己的)
- Windows下搭建Objective-C运行环境
- ios播放音频
- Chrome中canvas报Cannot call method 'getContext' of null
- linux下svn命令大全
- 中缀表达式转后缀表达式求值
- 一个页面中多个window.onload = function(){}冲突问题解决方案
- ios5 支持 json 转化
- 常用的颜色色值(转)
- 向老大学到的东东
- Displaying a Sorted, Paged, and Filtered Grid of Data in ASP.NET MVC
- fcvt()浮点数转换为字符串
- android recovery模式及ROM制作
- 有关读写文件的操作 (个人总结)