栈的运用-四则运算表达式求值

来源:互联网 发布: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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 教师被投诉打学生怎么办 遇到内向的学生教师应该怎么办 教师遇到顽劣的学生怎么办 家长质疑老师的能力怎么办 和领导有冲突该怎么办 孩子叫也不听特别叛逆怎么办 孩子叛逆期不听妈妈的话怎么办 学生和老师反嘴怎么办? 两个月的宝宝不拉屎怎么办 老师受家长的气怎么办 家长故意在班级群里气老师怎么办 幼儿园阿姨体罚孩子家长该怎么办 学生钱丢了老师怎么办 胸肌一边大一边小怎么办 被爱的人抛弃了怎么办 深蹲以后腿疼怎么办 做完蹲起大腿疼怎么办 练腿之后腿疼怎么办 深蹲做完后腿疼怎么办 做完上下蹲腿疼怎么办 钓鱼子线长了怎么办 烤箱烤红薯没有锡纸怎么办 烤箱烤羊肉串滴油怎么办 黄金虎嘴脱臼了怎么办 孕妇吃了马头鱼怎么办 慈鲷鱼生完小鱼怎么办 买的烤鱼片刺多怎么办 鸡蛋不太新鲜了怎么办 麻雀从巢里掉下来怎么办 小鱼生了鱼蛋怎么办 吃了没熟透的鱼怎么办 吃了变质的虾怎么办 吃了不新鲜的肉怎么办 吃不新鲜的虾怎么办 鸡胸肉不新鲜了怎么办 吃了不新鲜的鱼怎么办 生的猪肉有点臭怎么办? 猪肉馅不新鲜了怎么办 买的肉有点臭了怎么办 炸的东西不脆了怎么办 油炸东西回软了怎么办