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   itdef  阅读(189)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
历史上的今天:
2019-12-24 poj 2785 4 Values whose Sum is 0
2019-12-24 poj 3276 Face The Right Way 递推

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示