中缀表达式转换为后缀表达式 简易实现(c++)(简易表达式计算)
来源:互联网 发布:手机shell是什么软件 编辑:程序博客网 时间:2024/06/05 19:04
最近在学数据结构,看《数据结构与算法分析》来自学,在看到表 栈 队列这一章的时候发现后缀表达式这个比较好玩的东西,因为以前计算表达式的时候都是直接对中缀表达式进行处理,而且比较麻烦,现在有了后缀表达式的话就比较简单了,下面就是c++的实现
#include <iostream>#include <stack>using namespace std;//返回各个符号的优先级,数字最大int priority(char c){ if(c<='9'&&c>='0') return 10; else { switch(c) { case '+': case '-': return 1; break; case '*': case '/': return 2; break; case '(': case ')': return 3; } }}int main(){ string exp; cin>>exp; stack<char> oper; for(int i=0;i<exp.size();i++) { if(exp[i]==' ') continue; int score=priority(exp[i]); if(score==10)//是数字的话就输出 { cout<<exp[i]; } else { while(!oper.empty()&&priority(oper.top())>=score&&((oper.top()=='('&&score==3)||(oper.top()!='(')))//把所有优先级大于当前符号都输出 { if(oper.top()!='(') cout<<" "<<oper.top(); oper.pop(); } cout<<" ";//这里输出空格是为了防止两个数字粘在一起 if(exp[i]!=')') oper.push(exp[i]); } } while(!oper.empty())//处理完整个字符串之后把栈所有符号都输出 { if(oper.top()!='(') cout<<" "<<oper.top(); oper.pop(); } return 0;}
下面再附带一个后缀表达式求值的小函数
int sum(string exp){ stack<int> num; int n=0,t1,t2; for(int i=0;i<exp.size();i++) { if(exp[i]==' ') { //假如n不为0,直接入栈然后置0 if(n!=0) { num.push(n); n=0; } continue; } if(exp[i]<='9'&&exp[i]>='0')//处理数字 { n*=10; n+=(exp[i]-'0'); } else { //同上 if(n!=0) { num.push(n); n=0; } t1=num.top(); num.pop(); t2=num.top(); num.pop(); //处理运算 switch(exp[i]) { case '+': t2+=t1; break; case '-': t2-=t1; break; case '*': t2*=t1; break; case '/': t2/=t1; break; } num.push(t2); } } return num.top();}
最后配合sstream,就可以实现简易表达式的计算
#include <iostream>#include <stack>#include <sstream>using namespace std;int sum(string exp){ stack<int> num; int n=0,t1,t2; bool is_zero=false;//用来判断输入的数字是否为0 for(int i=0;i<exp.size();i++) { if(exp[i]==' ') { //假如n不为0,直接入栈然后置0 if(n!=0||is_zero) { num.push(n); n=0; is_zero=false; } continue; } if(exp[i]<='9'&&exp[i]>='0')//处理数字 { n*=10; n+=(exp[i]-'0'); is_zero=true; } else { //同上 if(n!=0||is_zero) { num.push(n); n=0; is_zero=false; } t1=num.top(); num.pop(); t2=num.top(); num.pop(); //处理运算 switch(exp[i]) { case '+': t2+=t1; break; case '-': t2-=t1; break; case '*': t2*=t1; break; case '/': t2/=t1; break; } num.push(t2); } } return num.top();}//返回各个符号的优先级,数字最大int priority(char c){ if(c<='9'&&c>='0') return 10; else { switch(c) { case '+': case '-': return 1; break; case '*': case '/': return 2; break; case '(': case ')': return 3; } }}int main(){ string exp; cin>>exp; stack<char> oper; stringstream ss; for(int i=0;i<exp.size();i++) { if(exp[i]==' ') continue; int score=priority(exp[i]); if(score==10)//是数字的话就输出 { ss<<exp[i]; } else { while(!oper.empty()&&priority(oper.top())>=score&&((oper.top()=='('&&score==3)||(oper.top()!='(')))//把所有优先级大于当前符号都输出 { if(oper.top()!='(') ss<<" "<<oper.top(); oper.pop(); } ss<<" ";//这里输出空格是为了防止两个数字粘在一起 if(exp[i]!=')') oper.push(exp[i]); } } while(!oper.empty())//处理完整个字符串之后把栈所有符号都输出 { if(oper.top()!='(') ss<<" "<<oper.top(); oper.pop(); } cout<<ss.str()<<endl; cout<<sum(ss.str())<<endl; return 0;}
0 0
- 中缀表达式转换为后缀表达式 简易实现(c++)(简易表达式计算)
- C语言简易计算器(中缀表达式转后缀表达式,通过堆栈实现)
- JAVA实现中缀表达式转换为后缀表达式并计算
- 中缀表达式转换为后缀表达式(C)
- 中缀表达式转换为后缀表达式,计算后缀表达式
- 中缀表达式转换为后缀表达式&后缀表达式的计算
- 表达式求值(中缀表达式转换为后缀表达式)
- 简易实现后缀表达式
- 中缀表达式转化为后缀表达式,计算中缀表达式,计算后缀表达式(有注释)(逆波兰表达式)
- 中缀表达式转后缀表达式 (中缀表达式的计算)
- 中缀表达式转换为后缀表达式(栈的使用)
- 中缀表达式转换为后缀表达式(栈的使用)
- 中缀表达式转换为后缀表达式(栈的使用)
- 中缀表达式转换为后缀表达式(栈的使用)
- 中缀表达式转换为后缀表达式(栈的使用)
- 中缀表达式转换到后缀表达式(java实现)
- 中缀表达式转换后缀表达式并求值(java实现)
- 中缀表达式转换后缀表达式并求值(java实现)
- [替罪羊树 动态点分治 替罪羊式重构] BZOJ 3435 [Wc2014]紫荆花之恋 & UOJ #55 【WC2014】紫荆花之恋
- 生物密码具有唯一性和不变性,必须掌握在自己手中!
- 《牛客网剑指offer38题》输入一棵二叉树,求该树的深度
- 深入margin
- 消息队列技术的介绍和原理(MQ)
- 中缀表达式转换为后缀表达式 简易实现(c++)(简易表达式计算)
- android webview下载附件几种方法
- 1001. A+B Format (20)
- PAT 1114 Family Property
- 走进后端,掌握php基本语法
- Java IO/NIO网络编程资料
- 继电器工作原理
- leetcode经典编程题(4)
- 个人毕业校招小面经