【LeetCode-栈/数学】基本计算器 II

题目描述

实现一个基本的计算器来计算一个简单的字符串表达式的值。

字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例:

输入: "3+2*2"
输出: 7

输入: " 3/2 "
输出: 1

输入: " 3+5 / 2 "
输出: 5

说明:

  • 你可以假设所给定的表达式都是有效的。
  • 请不要使用内置的库函数 eval。

题目链接: https://leetcode-cn.com/problems/basic-calculator-ii/

思路

使用一个栈 nums 存储计算的中间结果,使用变量 preOpr 记录前一个运算符,假设当前数字是 cur:

  • 如果 preOpr=='+',则将 cur 入栈;
  • 如果 preOpr=='-',则将 -cur 入栈;
  • 如果 preOpr=='*',因为 * 的优先级比加减高,所以将 nums 栈顶元素乘以 cur;
  • 如果 preOpr=='/',因为 / 的优先级比加减高,所以将 nums 栈顶元素除以 cur;

这样的话,将字符串遍历一遍,栈中就会存储一些中间结果。我们将栈中的中间结果全部相加就是最终的答案。

代码如下:

class Solution {
public:
    int calculate(string s) {
        if(s.empty()) return 0;

        stack<int> nums;
        char preOpr = '+';
        int cur = 0;
        s += "#"; // 表示字符串结束,最后一个数字进入else分支
        for(int i=0; i<s.size(); i++){
            if(s[i]==' ') continue;
            if(isdigit(s[i])){
                cur = cur * 10 + (s[i] - '0');
            }else{
                if(preOpr=='+') nums.push(cur);
                else if(preOpr=='-') nums.push(-cur);
                else if(preOpr=='*') nums.top() *= cur;
                else if(preOpr=='/') nums.top() /= cur;
                cur = 0;
                preOpr = s[i];
            }
        }

        int ans = 0;
        while(!nums.empty()){
            ans += nums.top();
            nums.pop();
        }
        return ans;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

参考

https://leetcode-cn.com/problems/basic-calculator-ii/solution/li-yong-zhan-jiang-si-ze-yun-suan-hua-jian-cheng-j/

posted @ 2020-07-15 15:07  Flix  阅读(157)  评论(0编辑  收藏  举报