返回

栈数据结构:理解先进后出的原则

后端

栈的数据结构

栈是一种先进后出的数据结构,即后进的元素将首先出栈。栈通常用链表或数组实现,使用last in first out(LIFO)的原则。栈的特点是仅能从一端(称为栈顶)进行元素的存取。

栈的操作

栈的操作包括:

  • 压入(push) :向栈中添加一个元素。
  • 弹出(pop) :从栈中移出一个元素。
  • 窥视(peek) :查看栈顶的元素,但不移出它。
  • 是否为空(isEmpty) :检查栈是否为空。
  • 大小(size) :返回栈中元素的个数。

栈的应用

栈在计算机科学和算法中有着广泛的应用,包括:

  • 函数调用栈 :栈用于存储函数调用的顺序,当一个函数被调用时,它的参数和局部变量被压入栈中。当函数返回时,它的参数和局部变量被弹出栈。
  • 二叉搜索树 :栈用于存储二叉搜索树的节点,当一个节点被访问时,它的子节点被压入栈中。当子节点被访问完后,节点被弹出栈。
  • 表达式求值 :栈用于存储表达式的操作数和运算符,当一个运算符被遇到时,它的操作数被弹出栈,并进行相应的运算。运算结果被压入栈中。
  • 递归算法 :栈用于存储递归调用的参数和局部变量,当一个递归函数被调用时,它的参数和局部变量被压入栈中。当递归函数返回时,它的参数和局部变量被弹出栈。

栈的代码示例

以下是用Python实现的栈类:

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

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def peek(self):
        return self.items[-1]

    def isEmpty(self):
        return self.items == []

    def size(self):
        return len(self.items)


# 使用栈来反转一个列表
def reverse_list(lst):
    stack = Stack()
    for item in lst:
        stack.push(item)

    reversed_lst = []
    while not stack.isEmpty():
        reversed_lst.append(stack.pop())

    return reversed_lst


# 使用栈来检查括号是否匹配
def is_balanced(expr):
    stack = Stack()
    for char in expr:
        if char in "([{":
            stack.push(char)
        elif char in ")]}":
            if stack.isEmpty():
                return False
            popped_char = stack.pop()
            if not is_matching(popped_char, char):
                return False

    return stack.isEmpty()


def is_matching(char1, char2):
    return (char1 == "(" and char2 == ")") or \
           (char1 == "[" and char2 == "]") or \
           (char1 == "{" and char2 == "}")


# 测试栈的应用
lst = [1, 2, 3, 4, 5]
print(reverse_list(lst))  # Output: [5, 4, 3, 2, 1]

expr = "([{}])"
print(is_balanced(expr))  # Output: True

expr = "([)]"
print(is_balanced(expr))  # Output: False

结论

栈是一种简单的数据结构,但它在计算机科学和算法中有着广泛的应用。栈遵循先进后出的原则,可以用来解决各种各样的问题,如函数调用栈、二叉搜索树、表达式求值和递归算法。