leetcode刷题17——计算器系列

本文解析了两种基本计算器实现,涉及括号处理、栈操作,以及更复杂版本处理整数除法。第一部分讲解了字符串表达式计算,第二部分则增加了整数除法的精度控制。适合理解栈和表达式求值算法的深入学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.基本计算器
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
1 <= s.length <= 3 * 105;
s 由数字、’+’、’-’、’(’、’)’、和 ’ ’ 组成;
s 表示一个有效的表达式。
考察知识点:括号展开、栈

class Solution {
public:
    int calculate(string s) {
        stack<int> st;
        st.push(1);
        int sign = 1;
        int ans = 0;
        int i = 0;
        while(i < s.size()) 
        {
            if (s[i] == ' ') {
                i++;
            } else if (s[i] == '+') {
                sign = st.top();
                i++;
            } else if (s[i] == '-') {
                sign = -st.top();
                i++;
            } else if (s[i] == '(') {
                st.push(sign);
                i++;
            } else if (s[i] == ')') {
                st.pop();
                i++;
            } else {
                long num = 0;
                while (i < s.size() && isdigit(s[i]))
                {
                    num = num * 10 + int(s[i] - '0');
                    i++;
                }
                ans += sign * num;
            }
        }
        return ans;
    }
};

或者

class Solution {
public:
    int calculate(string s) {
        stack<int> st;
        st.push(1);
        int sign = 1;
        int ans = 0;
        for (int i = 0; i < s.size(); ++i) 
        {
            if (s[i] == ' ') ;
            else if (s[i] == '+')   sign = st.top();
            else if (s[i] == '-')   sign = -st.top();
            else if (s[i] == '(')   st.push(sign);
            else if (s[i] == ')')   st.pop();
            else {
                long num = 0;
                while (i < s.size() && isdigit(s[i]))
                {
                    num = num * 10 + int(s[i] - '0');
                    i++;
                }
                ans += sign * num;
                i--;
            }
        }
        return ans;
    }
};

2.基本计算器 II
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。
1 <= s.length <= 3 * 105;
s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开;
s 表示一个 有效表达式;
表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内;
题目数据保证答案是一个 32-bit 整数。
考察知识点:栈

class Solution {
public:
    int calculate(string s) {
        vector<int> v;
        char presign = '+';
        int num = 0;
        for (int i = 0; i < s.size(); ++i) 
        {
            if (isdigit(s[i])) 
                num = num * 10 + int(s[i] - '0');
            if (ispunct(s[i]) || i == s.size() - 1)
            {
                if(presign=='+')    v.push_back(num);
                if(presign=='-')    v.push_back(-num);
                if(presign=='*')    v.back() *= num;
                if(presign=='/')    v.back() /= num;
                presign = s[i];
                num = 0;
            }
        }
        return accumulate(v.begin(), v.end(), 0);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给算法爸爸上香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值