栈的运用-四则运算表达式求值
来源:互联网 发布:matlab和python 编辑:程序博客网 时间:2024/05/19 19:41
分为两步
1.将中缀表达式转化为后缀表达式(栈用来进出运算的符号)
规则:从左到右遍历中缀表达式中的每一个数字和符号,若是数字就直接输出,即成为后缀表达式的一部分;若是符号,则判断其余栈顶的符号的优先级,是右括号或者优先级不高于栈顶符号的优先级,则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式
string middleToLast(string middle){string last="";char pre;if(middle.empty())return last; int len=middle.length();stack<char> s;for(int i=0;i<len; i++){//是数字的时候直接输出 if(middle[i]>='0'&&middle[i]<='9'){last+=middle[i];pre=middle[i];}//栈为空且不是数字的时候直接进栈 else if(s.empty()){if(!(pre==' ')){last+=' ';pre=' ';}s.push(middle[i]);}//是加减符号的时候,看栈顶元素的优先级是否不低于这时候的符号,就出栈 else if(middle[i]=='+'||middle[i]=='-'){while(!s.empty()){char top=s.top();if(top=='+'||top=='-'|top=='*'||top=='/'){if(!(pre==' ')){last+=' ';pre=' ';}last+=top;pre=top;s.pop();}else{break;}}if(!(pre==' ')){last+=' ';pre=' ';}s.push(middle[i]);}//是乘除符号的时候,看栈顶元素的优先级是否不低于这时候的符号,就出栈 else if(middle[i]=='*'||middle[i]=='/'){while(!s.empty()){char top=s.top();if(top=='*'||top=='/'){if(!(pre==' ')){last+=' ';pre=' ';}last+=top;pre=top;s.pop();}else{break;}}if(!(pre==' ')){last+=' ';pre=' ';}s.push(middle[i]);}//遇到右括号,一直出栈到左括号 else if(middle[i]==')'){while(!s.empty()){char top=s.top();if(top=='('){s.pop();break;}else{if(!(pre==' ')){last+=' ';pre=' ';}last+=top;pre=top;s.pop(); }}}else{if(!(pre==' ')){last+=' ';pre=' ';}s.push(middle[i]);}}while(!s.empty()){if(!(pre==' ')){last+=' ';pre=' ';}last+=s.top();pre=s.top();s.pop();}return last;}
2.将后缀表达式进行运算得出结果(栈用来进出元算的数字)
规则:从左到右遍历表达式的每一个数字和符号,遇到数字就进栈,遇到的是符号,就将处于栈顶两个数字出栈,进行运算,运算结果出栈,一直到最终获得结果
#include<iostream>#include<stack>#include<string>using namespace std;string middleToLast(string middle){string last="";char pre;if(middle.empty())return last; int len=middle.length();stack<char> s;for(int i=0;i<len; i++){//是数字的时候直接输出 if(middle[i]>='0'&&middle[i]<='9'){last+=middle[i];pre=middle[i];}//栈为空且不是数字的时候直接进栈 else if(s.empty()){if(!(pre==' ')){last+=' ';pre=' ';}s.push(middle[i]);}//是加减符号的时候,看栈顶元素的优先级是否不低于这时候的符号,就出栈 else if(middle[i]=='+'||middle[i]=='-'){while(!s.empty()){char top=s.top();if(top=='+'||top=='-'|top=='*'||top=='/'){if(!(pre==' ')){last+=' ';pre=' ';}last+=top;pre=top;s.pop();}else{break;}}if(!(pre==' ')){last+=' ';pre=' ';}s.push(middle[i]);}//是乘除符号的时候,看栈顶元素的优先级是否不低于这时候的符号,就出栈 else if(middle[i]=='*'||middle[i]=='/'){while(!s.empty()){char top=s.top();if(top=='*'||top=='/'){if(!(pre==' ')){last+=' ';pre=' ';}last+=top;pre=top;s.pop();}else{break;}}if(!(pre==' ')){last+=' ';pre=' ';}s.push(middle[i]);}//遇到右括号,一直出栈到左括号 else if(middle[i]==')'){while(!s.empty()){char top=s.top();if(top=='('){s.pop();break;}else{if(!(pre==' ')){last+=' ';pre=' ';}last+=top;pre=top;s.pop(); }}}else{if(!(pre==' ')){last+=' ';pre=' ';}s.push(middle[i]);}}while(!s.empty()){if(!(pre==' ')){last+=' ';pre=' ';}last+=s.top();pre=s.top();s.pop();}return last;}int compute(string last){stack<int> s;int len=last.length();int sum=0;for(int i=0; i<len; i++){//遇到数字进栈 if(last[i]>='0'&&last[i]<='9'){sum*=10;sum+=last[i]-'0';}else if(last[i]==' '&&(last[i-1]>='0'&&last[i-1]<='9')){s.push(sum);sum=0;}//遇到符号,将处于栈顶的两个进行相应的计算,在讲结果进栈 else if(last[i]=='+'){int top1=s.top();s.pop();int top2=s.top();s.pop();int res=top2+top1;s.push(res);}else if(last[i]=='-'){int top1=s.top();s.pop();int top2=s.top();s.pop();int res=top2-top1;s.push(res);}else if(last[i]=='*'){int top1=s.top();s.pop();int top2=s.top();s.pop();int res=top2*top1;s.push(res);}else if(last[i]=='/'){int top1=s.top();s.pop();int top2=s.top();s.pop();int res=top2/top1;s.push(res);}}return s.top();} int main(){string M,L;cin>>M;L=middleToLast(M);cout<<L<<endl;int res=compute(L);cout<<res<<endl;return 0;}
0 0
- 栈的运用-四则运算表达式求值
- 栈的应用-四则运算表达式的求值
- 四则运算表达式求值(栈的应用)
- 四则运算表达式求值(栈的应用)
- 栈的应用:四则运算表达式求值
- 四则运算表达式求值(栈的应用)
- 四则运算表达式求值(栈的应用)
- 栈的应用---四则运算表达式求值
- 四则运算表达式求值(栈的应用)
- 栈的应用-四则运算表达式求值
- 四则运算表达式求值(栈的应用)
- 栈的应用:四则运算表达式求值
- 表达式求值之栈的灵活运用
- 表达式求值(栈的运用)
- 栈的运用之表达式求值
- 数据结构之简单四则运算表达式求值8-(栈的实现)
- 栈的应用——四则运算表达式求值
- 栈的应用--四则运算表达式求值(java代码)
- eclipse中创建dynamic web project项目
- javascript中获取参数的方法
- 【GMT】使用变量的时候,空格不可以乱加
- tcp协议案例
- 3--编译预处理
- 栈的运用-四则运算表达式求值
- Anroid 加载图片方式一 使用SmartImageView
- 使用SQl方法把多行字符直接转换成相应的表输出
- 全端工程师必备技能汇总
- ZOJ 3946 Highway Project(Dijkstra)
- 优先级队列
- 官文:从今天开始开发iOS应用(Swift)第一章4~5节纯中文
- 训练深度神经网络的时候需要注意的技巧
- XDU-1138 Z1+Z2 (水~复数相加) From 西电校赛网络赛