2 1.000+2/4= ((1+2)*5+1)/4=
1.50 4.00
#include<cstdio> #include<cctype> #include<stack> #include<cstring> #include<cstdlib> using namespace std; void Calculate(stack<double>& opnd,stack<char>& optr) { double result,a,b; b=opnd.top(); opnd.pop(); a=opnd.top(); opnd.pop(); char op=optr.top(); optr.pop(); switch(op) { case ‘+‘: result=a+b; break; case ‘-‘: result=a-b; break; case ‘*‘: result=a*b; break; case ‘/‘: result=a/b; break; } opnd.push(result); } int PriThan(char a,stack<char>& optr) { if(a==‘(‘) return 0; if(optr.top()==‘(‘) return 1; if(a==‘+‘||a==‘-‘) return 0; if(optr.top()==‘*‘||optr.top()==‘/‘) return 0; return 1; } int main(int argc,char *argv[]) { stack<double> opnd; stack<char> optr; int i,n,len; char str[1005]; scanf("%d",&n); getchar(); while(n--) { scanf("%s",str); len=strlen(str); for(i=0;i<len;i++) { if(isdigit(str[i])) { double num=atof(&str[i]); while(i<len&&(isdigit(str[i])||str[i]==‘.‘)) i++; i--; opnd.push(num); } else if(str[i]==‘(‘) optr.push(str[i]); else if(str[i]==‘)‘) { while(optr.top()!=‘(‘) Calculate(opnd,optr); optr.pop();//弹出‘(’ } else { while(!optr.empty()) { if(!PriThan(str[i],optr))//栈顶运算符的优先级高于 { //字符c,那么对栈顶运算符进行计算 Calculate(opnd,optr); } else break; } optr.push(str[i]); } } optr.pop(); while(!optr.empty()) Calculate(opnd,optr); printf("%.2f\n",opnd.top()); opnd.pop(); } return 0; }
原文:http://blog.csdn.net/u012736084/article/details/19006891