Basic caculator
这题有几种思路,都不是很简单,这就是为啥计算机喜欢用波兰和你波兰,因为求值非常简单,已经体现了运算符优先级了。
1. 运算符优先级表,非常麻烦,需要n*n的表格
2. 用火车调度场算法将中缀边后缀,dijstra发明的,算法细节多,不容易写对
3. 下面的算法,前提是只有+-()
class Solution {
public:
int calculate(string s) {
stack<int> st;
int num=0, result=0, sign=1;
for(auto e: s){
if(isdigit(e)){
num=num*10+e-'0';
}else if(e=='+'){
result+=num*sign;
num=0;
sign=1;
}else if(e=='-'){
result+=num*sign;
num=0;
sign=-1;
}else if(e=='('){
st.push(result);
st.push(sign);
num=0;
sign=1;//non-negative
result=0;
}else if(e==')'){
result+=num*sign;
num=0;
sign=1;
result*=st.top();st.pop();
result+=st.top();st.pop();
}
}
if(num) result+=num*sign;
return result;
}
};
这里面其实是添加了符号进去来求值,因此相对比较简单