LeetCode224.基本计算器【困难】——2021.3.10

本文介绍了一个基本计算器的设计与实现,能够解析并计算简单的字符串表达式。文章详细解释了使用栈的数据结构来处理括号和运算符的过程,通过示例展示了算法的工作原理。

题目描述:
实现一个基本的计算器来计算一个简单的字符串表达式 s 的值。

示例 1:
输入:s = “1 + 1”
输出:2

示例 2:
输入:s = " 2-1 + 2 "
输出:3

示例 3:
输入:s = “(1+(4+5+2)-3)+(6+8)”
输出:23

提示:
1 <= s.length <= 3 * 105
s 由数字、’+’、’-’、’(’、’)’、和 ’ ’ 组成
s 表示一个有效的表达式

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

通过代码:

class Solution:
    def calculate(self, s: str) -> int:
        s = s.replace(" ", "")
        #print(s)
        res = 0
        stack = []
        n = len(s)
        i = 0
        cur_num = ""
        sign = 1
        while i < n:
            # print(sign)
            if s[i] == '-':
                sign = -1
                i += 1
            elif s[i] == '+':
                sign = 1
                i += 1
            elif s[i] == '(':
                stack.append(res)
                stack.append(sign)
                #print(stack)
                res = 0
                sign = 1
                i += 1
            elif s[i] == ')':
                res = stack.pop(-1) * res + stack.pop(-1)
                i += 1
            else:
                while i < n and '0' <= s[i] <= '9':
                    #print(s[i])
                    cur_num += s[i]
                    i += 1
                res += ( sign * int(cur_num) )
                cur_num = ""
        return res

注意事项:

栈,每遇到 ‘(’ 将目前的 和res 与 符号sign(-1,1) 入栈,并将res置0、sign置1,当遇到 ‘)’ 时,说明一个括号内的和res计算完毕,将这个 和res 乘以栈中的 符号sign 并将之前的 和res 相加,循环内重复操作即可。(每计算一部分的和,就将结果和符号位压入栈,每遇到闭合括号,就做累加,保证最后是对的结果)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值