提交时间:2024-07-18 10:53:53

运行 ID: 156687

#include<bits/stdc++.h> #define ll long long using namespace std; stack<double>num;//数字栈 stack<char>op;//符号栈 int h(char a)//运算优先级 { if(a=='(')return 0;//None else if(a=='+'||a=='-')return 1; else if(a=='*'||a=='/')return 2; else return 3;//^ } void calc()//求值 { double a=num.top();//第二个操作数 num.pop(); double b=num.top();//第一个操作数 num.pop(); char p=op.top();//运算符 op.pop(); double r=0;//结果 //计算结果 if(p=='+')r=b+a; if(p=='-')r=b-a; if(p=='*')r=b*a; if(p=='/')r=b/a; num.push(r);//结果入栈 } int main() { if(1==1){ string s;//读入表达式 getline(cin,s); for(int i=0;i<s.size();i++){ if(s[i]==' ')s.erase(i,1); } for (ll int i=0; i<s.size();i++) { if (isdigit(s[i]))//数字入栈 { ll int x=0,j=i;//计算数字 while (j<s.size()&&isdigit(s[j])) { x=x*10+s[j]-'0';//'0':结束标识符 j++; } num.push(x);//数字入栈 i=j-1; } else if(s[i]=='(') { op.push(s[i]); } else if (s[i]==')')//右括号 { while(op.top() != '(')//一直计算到左括号 calc(); op.pop();//左括号出栈 } else { while (op.size()&&h(op.top())>=h(s[i]))//若上一个运算符优先级低,先计算 calc(); op.push(s[i]);//操作符入栈 } } while (op.size())calc();//其余进行计算) printf("%.2lf",num.top()); } return 0; }