LeetCode 227. 基本计算器 II 栈 双指针

地址 https://leetcode-cn.com/problems/basic-calculator-ii/

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

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

示例 1:

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

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

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

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

算法1
有了加减乘除多种符号后 就要考虑符号优先级
解决办法是遇到+- 符号 数字入栈
遇到*/则再入栈下一个数字后进行计算 然后计算结果入栈
最后整个符号栈应该就只剩同级别的+-符号了
这时候应该从前往后计算而不是使用栈的倒序计算
所以本题我数据结构选用了deque 而不是stack

有不同级别的操作符号 需要stack辅助 逆序计算

如果全部操作符号相同那么从前至后计算即可

C++ 代码

class Solution {
public:
    deque<int> deNum;
    deque<int> deOp;

    int calc(int a, int b, char op) {
        if (op == '+') return a + b;
        if (op == '-') return a - b;
        if (op == '/') return a / b;
        if (op == '*') return a * b;
        return -9999999;
    }

    int calculate(string s) {
        int opFlag = 0;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '*' || s[i] == '/' ) {
                opFlag = 1;  deOp.push_back(s[i]);
            }
            else if (s[i] == '+' || s[i] == '-') {
                deOp.push_back(s[i]);
            }
            else if (s[i] == ' ') {
                continue;
            }
            else {
                int l = i;
                while (l < s.size() && s[l] == ' ') l++;
                int r = l + 1;
                while (r < s.size() && s[r] >= '0' && s[r] <= '9') r++;
                string strNum = s.substr(l, r - l);
                int n = atoi(strNum.c_str());
                deNum.push_back(n);
                i = r - 1;
                if (opFlag == 1) {
                    opFlag = 0;
                    int a = deNum.back(); deNum.pop_back();
                    int b = deNum.back(); deNum.pop_back();
                    char op = deOp.back(); deOp.pop_back();
                    int c = calc(b, a, op);
                    deNum.push_back(c);
                }
            }
        }

        while (!deOp.empty()) {
            //相同级别符号 从前面计算
            int a = deNum.front(); deNum.pop_front();
            int b = deNum.front(); deNum.pop_front();
            char op = deOp.front(); deOp.pop_front();
            int c = calc(a, b, op);
            deNum.push_front(c);
        }

        return deNum.front();
    }
};

 

 

posted on 2020-12-24 14:43  itdef  阅读(186)  评论(0编辑  收藏  举报

导航