leetcode写题笔记 -- 基本计算器

/*
224. 基本计算器

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

示例 1:
输入:s = "1 + 1"
输出:2
示例 2:
输入:s = " 2-1 + 2 "
输出:3
示例 3:
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23

提示:
1 <= s.length <= 3 * 105
s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
s 表示一个有效的表达式
'+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)
'-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)
输入中不存在两个连续的操作符
每个数字和运行的计算将适合于一个有符号的 32位 整数
*/

class Solution {
public:
    int calculate(string s) {
        stack<int> ope;
        ope.push(1);
        int oper = 1;

        int tmpResult = 0;

        int i = 0;
        int n = s.length();
        while (i < n) {
            if (s[i] == ' ') i++;
            else if (s[i] == '+') {
                oper = ope.top();
                i++;
            }
            else if (s[i] == '-') {
                oper = -ope.top();
                i++;
            }
            else if (s[i] == '(') {
                ope.push(oper);
                i++;
            }
            else if (s[i] == ')') {
                ope.pop();
                i++;
            }
            else {
                long int numCur = 0;
                while (i < n && s[i] >= '0' && s[i] <= '9') {
                    numCur = numCur * 10 + s[i]-'0';
                    i++;
                }
                tmpResult += numCur * oper;
            }
        }
        return tmpResult;
    }
};

// 8 ms + 7.9 MB  抄标准参考答案的代码,思路为每次遇到+、-运算符时判断它要不要变号,其中借助括号和栈去记录括号前负号的作用域。

class Solution {
public:
    int calculate(string s) {
        stack<char> ope;
        stack<int> num;
        //num.push(0);
        int tmpResult = 0;
        int i = 0, n = s.length();
        while (i < n) {
            if (s[i] == ' ')i++;
            else if (s[i] == '+' || s[i] == '-') {
                if (!ope.empty() && ope.top() != '(') {
                    if (ope.top() == '+') {
                        tmpResult += num.top();
                        num.pop();
                        tmpResult += num.top();
                        num.pop();
                        ope.pop();
                    }
                    else if (ope.top() == '-') {
                        tmpResult -= num.top();
                        num.pop();
                        tmpResult += num.top();
                        num.pop();
                        ope.pop();
                    }
                    num.push(tmpResult);
                    tmpResult = 0;
                    ope.push(s[i]);
                }
                else if (num.empty()) {
                    num.push(0);
                    ope.push(s[i]);
                }
                else {
                    ope.push(s[i]);
                }
                i++;
            }
            else if (s[i] == '(') {
                ope.push(s[i]);
                i++;
            }
            else if (s[i] == ')') {
                if (ope.top() == '(') {
                    ope.pop();
                }
                else {
                    if (ope.top() == '+') {
                        tmpResult += num.top();
                        num.pop();
                        tmpResult += num.top();
                        num.pop();
                        ope.pop();
                    }
                    else if (ope.top() == '-') {
                        tmpResult -= num.top();
                        num.pop();
                        tmpResult += num.top();
                        num.pop();
                        ope.pop();
                    }
                    ope.pop();
                    num.push(tmpResult);
                    tmpResult = 0;
                }
                i++;
            }
            else {
                long int tmpNum = 0;
                while (i < n && s[i] >= '0' && s[i] <= '9') {
                    tmpNum = tmpNum * 10 + s[i] - '0';
                    i++;
                }
                num.push(tmpNum);
            }
        }
        while (!ope.empty() && !num.empty()) {
            if (ope.top() == '+') {
                tmpResult += num.top();
                num.pop();
                if (!num.empty())tmpResult += num.top();
                ope.pop();
                num.pop();
            }
            else if (ope.top() == '-') {
                tmpResult -= num.top();
                num.pop();
                if (!num.empty())tmpResult += num.top();
                ope.pop();
                num.pop();
            }
        }
        if (!num.empty()) tmpResult += num.top();
        return tmpResult;
    }
};


// 写不下去了:    暂时debug进度: "1-(-2)"无法处理,会报错
// 总结: 还是得用"判断+、-是否需要变号"那个思路

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值