返回
栈数据结构:理解先进后出的原则
后端
2023-09-18 11:28:13
栈的数据结构
栈是一种先进后出的数据结构,即后进的元素将首先出栈。栈通常用链表或数组实现,使用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
结论
栈是一种简单的数据结构,但它在计算机科学和算法中有着广泛的应用。栈遵循先进后出的原则,可以用来解决各种各样的问题,如函数调用栈、二叉搜索树、表达式求值和递归算法。