问题:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值并写出算法。
回答:
#include<iostream>
#include<stack>#include<string>using namespace std;char Precede(char a,char b);double operate(double a1,char c,double b1);int main(){ stack<double> opnd; stack<char> optr; string s; char theta,c; int i,k; double a,b; while(getline(cin,s),s!="0") { opnd.push(s[0]-48); i=0; c=s[++i]; while(c!='\0') { if(c==' ') { c=s[++i]; continue; } if(c>='0'&&c<='9') { if(s[i-1]>='0'&&s[i-1]<='9')//此处重要,比如32字符是连续的多个不是单个 { a=opnd.top()*10+c-48; opnd.pop(); opnd.push(a); } else opnd.push(c-48); c=s[++i]; } else { if(optr.empty()!=true) { switch(Precede(optr.top(),c))//重点:运算符的优先级 { case '<':optr.push(c);c=s[++i];break;//如果前一个运算符比后一个下就进栈 case '>':theta=optr.top();//此处进行运算,并没有进栈,因为我是前面字符和后面字符比较 optr.pop(); //只有前面字符优先级高才运算 a=opnd.top(); opnd.pop(); b=opnd.top(); opnd.pop(); opnd.push(operate(b,theta,a)); break; } } else { optr.push(c); c=s[++i]; } } } while(optr.empty()!=true)//因为我先输入数字,可能最后剩下运算符没有处理 { theta=optr.top(); optr.pop(); a=opnd.top(); opnd.pop(); b=opnd.top(); opnd.pop(); opnd.push(operate(b,theta,a)); } printf("%.2lf\n",opnd.top()); } return 0;}char Precede(char a,char b)//比较运算符的优先级{ if(a=='+'||a=='-') { switch(b) { case '+': case '-':return '>';break; case '*': case '/':return '<';break; } } if(a=='*'||a=='/') return '>';}double operate(double a,char c,double b)//运算{ switch(c) { case '+':return (a+b);break; case '-':return (a-b);break; case '*':return a*b;break; case '/':return a/b;break; }}