栈的特性

栈的基本结构

我们可以把栈想象成一个装有弹珠的瓶子,先放进去的弹珠在瓶子底部,每次只能将顶部的弹珠倒出。

栈的特点

由图可以很好的知道后进先出

栈的实际应用

简单栈

栈的概念非常简单,但把这个数据结构运用得当是需要充分理解的。
应用1:判断字符串是否合法
特殊情况:如果只有一种字符需要配对,我们只需要记录当前需要配对字符的个数,遍历完这个字符串,如果个数为0,说明字符串合法。
具体可以进 cnt 记录当前需要配对字符的个数,初始化为 0,如果遇到左字符 +1,遇到右字符 -1。
如果有多种字符需要配对,这时候用栈就比较合适,因为配对的内容并不一致,栈比较适合配对和消除。
Python 代码:

class Stack:  
    def __init__(self):  
        self.stack = []  
  
    def push(self, item):  
        self.stack.append(item)  
  
    def pop(self):  
        if not self.is_empty():  
            return self.stack.pop()  
        else:  
            return ''
  
    def is_empty(self):  
        return len(self.stack) == 0  

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        stack = Stack()  
        mapping = {')': '(', ']': '[', '}': '{'}  
  
        for char in s:  
            if char in mapping:   
                if stack.is_empty() or stack.pop() != mapping[char]:  
                    return False  
            else:    
                stack.push(char)  
  
        return stack.is_empty() 

单调栈

LeetCode 739
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
Python 代码:

class Solution(object):
    def dailyTemperatures(self, temperatures):
        """
        :type temperatures: List[int]
        :rtype: List[int]
        """
        stack = Stack()
        res =  len(temperatures) * [0]

        for t in range(len(temperatures)):
            while (not stack.is_empty()) and  temperatures[t] > temperatures[stack.peek()]:
                index = stack.peek()
                res[index] = t - index
                stack.pop()
            stack.push(t) 

        return res