📜  数据结构和算法-Stack(1)

📅  最后修改于: 2023-12-03 14:54:57.118000             🧑  作者: Mango

数据结构和算法-Stack

介绍

Stack 是一个基于 LIFO(last in first out) 原则的数据结构。它可以看做是一种限制性线性表,只能在一端进行插入或删除操作。这一端称为栈顶,相对地,另一端称为栈底。Stack 可以通过 array 或者 linked list 实现。

操作

Stack 主要支持以下三个操作:

  • push(element):将元素压入栈顶;
  • pop():将栈顶的元素弹出并返回该元素;
  • peek():返回栈顶元素,但是不会将其弹出。

这些操作都是 O(1) 的复杂度。

Stack 还有一个常用的操作:

  • isEmpty():如果栈是空的,则返回 true。
实现
基于 Array

可以使用 array 实现 Stack。数组中的每个元素都有对应的下标。使用数组实现 Stack 时,需要考虑的一个问题是数组的大小。当添加的元素超出数组大小时,需要创建一个新的数组,并将所有数据复制到新的数组中。

class Stack:
    
    def __init__(self):
        self.items = []

    def push(self, value):
        self.items.append(value)
        
    def pop(self):
        return self.items.pop()
        
    def peek(self):
        return self.items[-1]

    def isEmpty(self):
        return len(self.items) == 0
基于 Linked List

可以使用 linked list 实现 Stack。

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None
    
class Stack:
    def __init__(self):
        self.top = None
    
    def push(self, value):
        node = Node(value)
        node.next = self.top
        self.top = node

    def pop(self):
        if self.isEmpty():
            return None

        node = self.top
        self.top = node.next
        node.next = None
        return node.value
    
    def peek(self):
        if self.isEmpty():
            return None
        return self.top.value
    
    def isEmpty(self):
        return self.top is None
应用

Stack 的一些常见应用:

  • 括号匹配问题 (Balanced Parentheses)
  • 迷宫问题 (Maze)
  • 四则运算表达式求值问题 (Evaluate Postfix Expression)
  • 逆波兰表达式求值问题 (Evaluate Prefix Expression)
  • 浏览器前进后退 (Browser Forward-Backward)
总结

Stack 是经典数据结构中的一种基本的数据结构。它的特点是 last in first out,可以支持 push、pop、peek 三种基本操作。Stack 可以基于 array 或者 linked list 实现。Stack 还有诸多常见应用,如括号匹配、迷宫问题、逆波兰表达式求值等等。