利用栈来计算表达式的值
#include <iostream>
#include <stack>
using namespace std;
int getPriority(char op){
if(op=='*'||op=='/'){
return 2;
}else if(op=='+'||op=='-'){
return 1;
}
}
float cal01(float od1,char op,float od2){
switch(op){
case '+':return od1+od2;
case '-':return od1-od2;
case '*':return od1*od2;
case '/':return od1/od2;
}
}
float cal(string s){
stack <int> od;
stack <char> op;
float tn=0,od1,od2,result=0;
char op1;
int lastpriority=0,priority;
for(int i=0;i<s.size();i++){
if((s[i]>='0')&&(s[i]<='9')){
tn=tn*10+float(s[i]-'0');
}else if(s[i]==' '){
}else{
od.push(tn);
priority=getPriority(s[i]);
if(lastpriority>=priority){
while(!op.empty()){
op1=op.top();
lastpriority=getPriority(op1);
if(lastpriority>=priority){
op.pop();
od2=od.top();
od.pop();
od1=od.top();
od.pop();
od1=cal01(od1,op1,od2);
od.push(od1);
}else{
break;
}
}
op.push(s[i]);
}else{
op.push(s[i]);
}
tn=0;
lastpriority=priority;
}
}
od.push(tn);
while(!op.empty()){
op1=op.top();
op.pop();
od2=od.top();
od.pop();
od1=od.top();
od.pop();
result=cal01(od1,op1,od2);
od.push(result);
}
return result;
}
int main(){
cout<<"12+2*3+4/2-1="<<cal("12+2*3+4/2-1")<<endl;
return 0;
}