栈实现表达式求值(多位数)加减乘除括号
表达式求值
题目描述:输入一个表达式,含加减乘除括号运算,输出表达式的值。
例如:求20+(3*400)-100/3的值
代码如下:
#include<iostream> #include<stack> using namespace std; bool cmp(char a,char b)//优先级判断函数 { if(a=='*'||a=='/'){ if(b=='*'||b=='/') return false; else return true;} else return false; } void f1(string s)//求值函数 { stack<char>czstack;///操作符栈 stack<float>qzstack;//数字栈 int len=s.length(); for(int i=0;i<len;i++){ char t=s[i]; if(t=='(') czstack.push(s[i]); else if(t>='0'&&t<='9'){ //数字直接入栈 float p=(t-'0')*1.0; while(s[i+1]>='0'&&s[i+1]<='9')//多位数转换 { p=(p*10+s[i+1]-'0')*1.0; i++; } qzstack.push(p); } else if(t==')'){ char ope=czstack.top(); while(ope!='('){ float x=qzstack.top();qzstack.pop(); float y=qzstack.top();qzstack.pop(); float tmp; if(ope=='+')tmp=x+y; else if(ope=='-')tmp=y-x; else if(ope=='*')tmp=x*y; else tmp=y/x; qzstack.push(tmp); czstack.pop(); ope=czstack.top(); } czstack.pop(); } else{ if(czstack.empty()) czstack.push(t); else{ char stp=czstack.top(); if(stp=='('||cmp(t,stp)) czstack.push(t); else{ while(!cmp(t,stp)&&!czstack.empty()&&stp!='('){ czstack.pop(); float x=qzstack.top();qzstack.pop(); float y=qzstack.top();qzstack.pop(); float tmp; if(stp=='+')tmp=x+y; else if(stp=='-')tmp=y-x; else if(stp=='*')tmp=x*y; else if(stp=='/') tmp=y/x; qzstack.push(tmp); if(!czstack.empty()) stp=czstack.top(); } czstack.push(t); } } } } while(!czstack.empty()){ char t=czstack.top(); float x=qzstack.top();qzstack.pop(); float y=qzstack.top();qzstack.pop(); float tmp; if(t=='+')tmp=x+y; else if(t=='-')tmp=y-x; else if(t=='*')tmp=x*y; else if(t=='/') tmp=y/x; qzstack.push(tmp); czstack.pop(); } cout<<s<<"="<<qzstack.top()<<endl; } int main() { string a; cin>>a; f1(a); return 0; }
运行截图:
注意
括号在入栈前优先级最高,但入栈后优先级降为最低。
欢迎评论交流,涛哥等待你的灼见。