LeetCode227. Basic Calculator II

24 篇文章 0 订阅
2 篇文章 0 订阅
题目链接:

https://leetcode.com/problems/basic-calculator-ii/

题目描述:

计算字符串表达式的值。可能会有多余空格。

题目分析:

这道题对于我来说坑略多啊。字符串表达式中的数字可能为多位数。比如
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;

十分感谢

http://blog.csdn.net/brucehb/article/details/46593913

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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值