06 | 栈

知识点

  1. 栈是一种常用的数据结构,它最大的特点是“后入先出”,即后进入栈中的元素最先出来。为了确保“后入先出”的顺序,栈的插入和删除操作都发生在栈顶。
  2. 很多时候保存在栈中的数据是排序的。根据题目的不同,栈中的数据既可能是递增排序的,也可能是递减排序的。因此,有人将这种用排序的栈解决问题的方法称为单调栈法。

基础练习

1. 后缀表达式

Leetcode.150

解题思路

考虑负数用Isdigit()判断时的特殊处理;考虑只有一个数字的时候要转化成整数的处理

python3实现

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        s =[]
        for token in tokens:
            if token.lstrip('-').isdigit():
                s.append(token)
            else:
                num1 = int(s.pop())
                num2 = int(s.pop())
                res = 0
                if token == '+':
                    res = num2 + num1
                elif token == '-':
                    res = num2 - num1
                elif token == '*':
                    res = num2 * num1
                    print(num1,num2,res)
                elif token == '/':
                    res = num2 / num1
                s.append(res)
        return int(s.pop(0))

2.直方图最大矩形面积

Leetcode.84

解题思路

  1. 常规方法:暴力双层循环、分治递归
  2. 更巧妙的方法是用单调栈

python3实现

3.最小栈

Leetcode.155

解题思路

用变量min_num保存最小值,每次pop和push的时候更新最小值,注意当pop后栈为空时的min_num取值变化。

python3实现

class MinStack:

    def __init__(self):
        self.stack=[]
        self.min_num = sys.maxsize


    def push(self, val: int) -> None:
        self.stack.append(val)
        self.min_num = min(val,self.min_num)

    def pop(self) -> None:
        pop_num = self.stack.pop()
        if pop_num == self.min_num and self.stack:
            self.min_num = min(self.stack)
        elif len(self.stack) == 0:
            self.min_num = sys.maxsize


    def top(self) -> int:
        if self.stack:
            return self.stack[-1]
        else:
            return 'error'


    def getMin(self) -> int:
        return self.min_num

4.有效的括号

Leetcode.20

解题思路

考虑边界场景,只有一个符号如何判断是否有效

python3实现

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        for i in s:
            if i=='(':
                stack.append(i)
            elif i==')':
                if len(stack) > 0 and stack[-1] == '(':
                    stack.pop()
                else:
                    stack.append(i)
            elif i=='[':
                stack.append(i)
            elif i==']':
                if len(stack) > 0 and stack[-1] == '[':
                    stack.pop()
                else:
                    stack.append(i)
            elif i=='{':
                stack.append(i)
            elif i=='}':
                if len(stack) > 0 and stack[-1] == '{':
                    stack.pop()
                else:
                    stack.append(i)
        if len(stack) == 0:
            return True
        else:
            return False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值