按照中缀转成后缀进行计算的,每次遇到优先级高的就弹出进行计算再压入栈中,在实际测试的时候,发现总是会优先匹配小括号再去匹配中括号和大括号,所以这三个的优先级大小不存在区别,这样的话就可以直接使用之前的表达式计算去做了
#include<iostream> #include<stack> using namespace std; char str[1005]; stack<double> num; stack<char> opt; int flag=1; bool isOperator(char ch){ if(ch=='+'||ch=='-'||ch=='*'||ch=='/') return true; else return false; } int getPriority(char ch){ int level=0; switch(ch){ case '(': case '[': case '{': level=1; break; case '+': case '-': level=2; break; case '*': case '/': level=3; break; default: break; } return level; } void cal(char c){ double a=num.top(); num.pop(); double b=num.top(); num.pop(); if(c=='+'){ num.push(a+b); }else if(c=='-'){ num.push(b-a); }else if(c=='*'){ num.push(a*b); }else if(c=='/'){ num.push(b/a); } } int main(){ while(cin>>str){ int i=0; flag=1; if(str[0]=='-'){ flag=-1; i++; } while(str[i]!=0){ //如果是数字 if(str[i]>='0'&&str[i]<='9'){ double tmp=0; do{ tmp=tmp*10+str[i]-'0'; i++; }while(str[i]>='0'&&str[i]<='9'); if(flag==-1){ tmp=tmp*flag; flag=1; } num.push(tmp); }else if(str[i]=='('||str[i]=='['||str[i]=='{'){ opt.push(str[i]); i++; if(str[i]=='-'){ flag=-1; i++; } }else if(isOperator(str[i])){ if(opt.empty()){ opt.push(str[i]); i++; }else{ while(!opt.empty()){ int c=opt.top(); if(getPriority(str[i])<=getPriority(c)){ cal(c); opt.pop(); }else{ break; } } opt.push(str[i]); i++; } }else if(str[i]==')'){ while(opt.top()!='('){ char c=opt.top(); opt.pop(); cal(c); } opt.pop(); i++; }else if(str[i]==']'){ while(opt.top()!='['){ char c=opt.top(); opt.pop(); cal(c); } opt.pop(); i++; }else if(str[i]=='}'){ while(opt.top()!='{'){ char c=opt.top(); opt.pop(); cal(c); } opt.pop(); i++; }else{ i++; } } while(!opt.empty()){ cal(opt.top()); opt.pop(); } printf("%g",num.top()); } return 0; }