张云聪
#include<string.h> #include<stack> #include<algorithm> #include<iostream> #include<stdio.h> using namespace std; //符号优先级 int priority(char c) { if(c == '=') return 0; if(c == '+') return 1; if(c == '-') return 1; if(c == '*') return 2; if(c == '/') return 2; return 0; } //计算 double change(double a,double b,char c) { if(c=='+') return a+b; if(c=='-') return a-b; if(c=='*') return a*b; if(c=='/') return a*1.0/b; } void compute(stack<double>& Num,stack<char>& Op) { double b = Num.top(); Num.pop(); double a = Num.top(); Num.pop(); switch(Op.top()) { case '+': Num.push(a+b); break; case '-': Num.push(a-b); break; case '*': Num.push(a*b); break; case '/': Num.push(a/b); break; } Op.pop();//计算出结果,运算符号 出栈 } int main(){ int t; cin>>t; while(t--){ char str[1001]; scanf("%s",str); getchar(); stack<char>fuhao; stack<double>num; for(int i=0;i<strlen(str);i++) { //获取数字, if(str[i]>='0'&&str[i]<='9') { char a[500]={0}; sscanf(str+i,"%[0-9.]",a);//获取0-9以及包含'.'的字符串,如果不满足,停止。 i+=strlen(a)-1;//i+字符串长度-1;因为for里面的i++,这里要len-1 double b;// b=atof(a);//字符串转换浮点数, num.push(b);//数字进栈 } //'('优先级最低,进栈 else if(str[i]=='(') { fuhao.push(str[i]); } //')',除非遇到和它匹配的')',否则一直运算 else if(str[i]==')') { while(fuhao.top()!='(') { compute(num,fuhao); } fuhao.pop();//'('出栈 } //当前运算符优先级比操作符栈顶运算符的优先级高,进栈 else if(fuhao.empty()||priority(str[i])>priority(fuhao.top())) fuhao.push(str[i]); //栈顶运算符优先级高,先计算,后符号进栈 else { while(!fuhao.empty()&&priority(str[i])<=priority(fuhao.top())) compute(num,fuhao); fuhao.push(str[i]); } } printf("%.2lf\n",num.top()); } }