栈实现表达式求值(多位数)加减乘除括号

    表达式求值

题目描述:输入一个表达式,含加减乘除括号运算,输出表达式的值。

例如:求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; }

注意

括号在入栈前优先级最高,但入栈后优先级降为最低。

经验分享 程序员 微信小程序 职场和发展