LeetCode-基本计算器类问题汇总(栈的应用)

30 篇文章 0 订阅

栈的概念:https://blog.csdn.net/qq_19446965/article/details/102982047

1、有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses/

遍历表达式:

  • 碰到左括号则入栈,
  • 碰到右括号,出栈一个左括号,不匹配则返回False,否则继续。

最后栈中如果为空则返回True,说明所有括号都匹配了

 def isValid(self, s):
        stack = []
        for ch in s:
            if ch == "(" or ch == "{" or ch == "[":
                stack.append(ch)
            else:
                if stack:
                    p = stack.pop()
                else:
                    return False
                if ch == ")" and p != "(":
                    return False
                if ch == "}" and p != "{":
                    return False
                if ch == "]" and p != "[":
                    return False
        return not stack

2、逆波兰表达式求值

根据逆波兰表示法,求表达式的值。

有效的运算符包括 +-*/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

用到栈(先进后出的数据结构)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/

遍历表达式:

  • 碰到数字则入栈
  • 碰到运算符则连续从栈中取出2个元素, 使用该运算符运算然后将结果入栈

最后栈中剩余一个数字, 就是结果.

def evalRPN(self, tokens):
        result = []
        for i in tokens:
            if i not in ('+', '-', '*', '/'):
                result.append(int(i))
            else:
                num1 = result.pop()
                num2 = result.pop()
                if i == '+':
                    result.append(num2 + num1)
                elif i == '-':
                    result.append(num2 - num1)
                elif i == '*':
                    result.append(num2 * num1)
                else:
                    result.append(int(num2 * 1.0 / num1))
        return result[0]

3、基本计算器

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

字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -非负整数和空格  

示例 :

输入: "(1+(4+5+2)-3)+(6+8)"
输出: 23

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator/

 def calculate(self, s):
        res = 0
        stack = []
        sign = 1 # 符号
        num = 0
        for c in s:
            if c.isdigit():
                num = num * 10 + int(c)
            elif c == "+":
                res += sign * num
                num, sign = 0, 1 # 为下一次做准备
            elif c == "-":
                res += sign * num
                num, sign = 0, -1 # 为下一次做准备
            elif c == "(":
                stack.append(res)
                stack.append(sign)
                sign = 1
                res = 0
            elif c == ")":
                res += sign * num  # 括号内的计算结果
                num = 0
                res = stack.pop() * res + stack.pop() # 括号外的符号*括号内的结果+括号外的结果
        res += sign * num
        return res

4、基本计算器 II

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator-ii/

  1. 本题增加了乘除法,注意:
  2. 结尾数字的处理
  • python2的取整方式:print(3/2, -3/2, int(-3/2), float(-3)/2, int(float(-3)/2))
  • python2: (1, -2, -2, -1.5, -1)
  • python3: 1.5 -1.5 -1 -1.5 -1
    def calculate(self, s: str) -> int:
        res = 0
        stack = [] # 存数
        sign = "+" # 存上一个符号
        num = 0
        for i, c in enumerate(s):
            if c.isdigit():
                num = num * 10 + int(c)
            if c in ('+-*/') or i == len(s)-1:
                if sign == "+":  # 本nun结尾,上一个符号为+,存储
                    stack.append(num)
                elif sign == "-":  # 本num结尾,上一个符号为-,存储
                    stack.append(-num)
                elif sign == "*":  # 本num结尾,上一个符号为*, 乘以num,存储
                    stack.append(stack.pop()*num)
                elif sign == "/":  # 本num结尾,上一个符号为/, 除以num,存储
                    stack.append(int(stack.pop()/num))  # 这里注意python2取整方式不通过
                    #stack.append(int(float(stack.pop())/num)) # python2写法
                num = 0
                sign = c
        return sum(stack)  # 对所有加法求和

其余栈的应用:

栈基本概念:https://blog.csdn.net/qq_19446965/article/details/102982047

接雨水:https://blog.csdn.net/qq_19446965/article/details/104144187

矩阵中最大矩形:https://blog.csdn.net/qq_19446965/article/details/82048028

基本计算器类:https://blog.csdn.net/qq_19446965/article/details/104717537

单调栈的应用:https://blog.csdn.net/qq_19446965/article/details/104720836

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值