题目链接:
题目描述:
计算字符串表达式的值。可能会有多余空格。
题目分析:
这道题对于我来说坑略多啊。字符串表达式中的数字可能为多位数。比如
345*16,第一次就跪这上面了,我没注意这个问题,以为只有个位。
这样解决就好。
while (i < len && s[i] >= '0' && s[i] <= '9'){
num = num * 10 + (s[i] - '0');
i++;
}
我最开始想的是当即将加入操作符栈的运算符优先级小于栈顶运算符优先级,就将操作数栈弹出两个数先与操作符栈的栈顶运算符运算,直到栈顶运算符优先级与即将入栈的运算符优先级相同。
其实不用这么麻烦啊 ╮(╯_╰)╭。
我在遍历的时候直接先把乘除算了啊,之后再算一次加减就好了啊。
在新数字加入操作数栈前,看看操作符栈的栈顶运算符是不是乘除,如果是就计算后,再加入。
最后算加减的时候,简直被自己蠢哭了。
while (OPD.size() >= 2 && !OPR.empty()){
char ch = OPR.top();
OPR.pop();
int num1 = OPD.top();
OPD.pop();
int num2 = OPD.top();
OPD.pop();
num1 = calculate(num1, num2, ch);
OPD.push(num1);
}
return OPD.top();
怎么能这样算呢,加入栈后,是反起来的了。
比如0-2 是为-2,此时操作数栈中栈顶是2,如果按我的代码来就是2-0=2,蠢哭啊。
正确的应该是:
int res=0;
while (!OPR.empty()){
int tmp=OPD.top();
char ch=OPR.top();
if(ch=='-'){
tmp=-tmp;
}
res+=tmp;
OPD.pop();
OPR.pop();
}
res+=OPD.top();
return res;
十分感谢
class Solution {
public:
stack<int> OPD;
stack<char> OPR;
int calculate(int num1, int num2, char opr){
switch (opr){
case '+':{
return num1 + num2;
}
case '-':{
return num1 - num2;
}
case '*':{
return num1*num2;
}
case '/':{
return num1 / num2;
}
}
}
int calculate(string s) {
int len = s.size();
int i=0;
while(i<len){
if (s[i] == ' '){
i++;
}
else if (s[i] == '+' || s[i] == '-' || s[i]=='*' || s[i]=='/'){
OPR.push(s[i]);
i++;
}
else{
int num = 0;
while (i < len && s[i] >= '0' && s[i] <= '9'){
num = num * 10 + (s[i] - '0');
i++;
}
if (!OPR.empty() && (OPR.top()=='/' || OPR.top()=='*')){
num = calculate(OPD.top(),num,OPR.top());
OPR.pop();
OPD.pop();
}
OPD.push(num);
}
}
int res=0;
while (!OPR.empty()){
int tmp=OPD.top();
char ch=OPR.top();
if(ch=='-'){
tmp=-tmp;
}
res+=tmp;
OPD.pop();
OPR.pop();
}
res+=OPD.top();
return res;
}
};