class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ //give operators the priority of '><=',1='>',2='<',3='=' int table[7][7]={1,1,2,2,2,1,1,1,1,2,2,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,2,2,2,2,2,3,3,1,1,1,1,3,1,1,2,2,2,2,2,3,3}; //string to int int toint(string s) { int x = 0; if (s[0] != '-') x = s[0] - '0'; for (int i = 1; i < s.size(); i++) { x *= 10; x += s[i] - '0'; } if (s[0] == '-') x = -x; return x; } //mach +-*/()# with 0123456 in the table int give(char c){ if(c=='+') return 0; else if(c=='-') return 1; else if(c=='*') return 2; else if(c=='/') return 3; else if(c=='(') return 4; else if(c==')') return 5; else return 6; } //compute int compute(int a, int o, int b){ if(o==0) return a+b; else if(o==1) return a-b; else if(o==2) return a*b; else return a/b; } int solve(string s) { // write code here s.push_back('#'); string num; stack<int> nums; stack<char> op; op.push('#'); int t1=-1,t2=-1; for (int i = 0; i < s.size(); i++) { //nums if((s[i]=='-'&&(i==0||s[i-1]=='('))||(s[i]<='9'&&s[i]>='0')){ num.push_back(s[i]); } //op else{ if(num!="") nums.push(toint(num)); num=""; t1=give(op.top()); t2=give(s[i]); int flag=table[t1][t2]; //case'=' 查询到括号或者完结符#,把上一个(退栈 if(flag==3){ op.pop(); } //case'<' 旧操作符优先度小于新操作符,保留旧操作符并让新符入栈 else if(flag==2){ op.push(s[i]); } //case'>' 计算上一个操作符,并使当前s[i]维持到下一轮 else{ int b=nums.top(); nums.pop(); int a=nums.top(); nums.pop(); int o=give(op.top()); op.pop(); nums.push(compute(a,o,b)); i--; } } } return nums.top(); } };