leetcode:227. 基本计算器 II

本文探讨了LeetCode中关于基本计算器的进阶问题,包括Calculator II、III和IV,涉及逆波兰表达式计算、括号处理和运算符优先级。通过实例解析和代码实现,深入解析了计算器算法的设计与优化技巧。
摘要由CSDN通过智能技术生成

题目来源

题目描述

在这里插入图片描述
在这里插入图片描述

题目解析

class Solution {
    struct Info{
        int idx;  //当前计算到的字符串
        long eval; // 计算得到的值

        Info(int idx, long eval) : idx(idx), eval(eval){
        }
    };

    void pushDeque(std::deque<std::string> &deque, long num){
        while (!deque.empty()){
            if(deque.back() == "+" || deque.back() == "-"){
                break;
            }else{
                std::string sign = deque.back(); deque.pop_back();
                long cur = stoi(deque.back()); deque.pop_back();
                num = sign == "*" ? (cur * num) : (cur / num);
            }
        }
        deque.push_back(std::to_string(num));
    }

    int calDeque(std::deque<std::string> &deque){
        long ans = 0;
        bool add = true;
        while (!deque.empty()){
            auto str = deque.front(); deque.pop_front();
            if(str == "+"){
                add = true;
            }else if(str == "-"){
                add = false;
            }else{
                ans = add ? ans + stol(str) : ans - stol(str);
            }
        }
        return ans;
    }

    // 计算idx....之后的值
    // 遇到 )或者结束时停止
    Info *process(string s, int i){
        int  N = s.size();
        long curr = 0;
        std::deque<std::string> deque;
        while (i < N && s[i] != ')'){
            if(s[i] >= '0' && s[i] <= '9'){
                curr = curr * 10 + s[i] - '0';
                i++;
            }else if(s[i] == ' '){
                i++;
            }else if(s[i] == '('){  //  2 + (3 + 5) * 6 --- curr = 0
                auto info = process(s, i + 1);  // !!!!
                curr = info->eval;
                i = info->idx + 1;
            }else{
                pushDeque(deque, curr);
                deque.emplace_back(1, s[i]);
                curr = 0; // !!!!!!!!
                i++;
            }
        }

        pushDeque(deque, curr);
        return new Info(i, calDeque(deque));
    }

    string checkStr(string &s){
        int j;
        for (j = s.size() - 1; j > 0 && s[j] == ' '; --j) {
        }
        s = s.substr(0, j + 1);
        return s;
    }
public:
    int calculate(string s) {
        s = checkStr(s);
        return (int)process(s, 0)->eval;
    }
};

类似题目

题目
leetcode:224. 基本计算器 Basic Calculator
leetcode:227. 基本计算器 II Basic Calculator II
772. 基本计算器 III Basic Calculator III
770. 基本计算器 IV Basic Calculator IV
150. 逆波兰表达式求值 Evaluate Reverse Polish Notation
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值