栈(Stack)是一种常见且重要的数据结构,因其简单的操作逻辑和广泛的应用场景,在计算机科学中扮演了不可替代的角色。本文将解析栈的基本原理、Python 中的实现方法,以及其实际应用场景。
目录
第一部分:栈的基础概念
第二部分:Python 中的栈实现
1. 使用列表实现栈
2. 使用 collections.deque 实现栈
第三部分:栈的实际应用
1. 表达式求值
2. 括号匹配
3. 浏览器的前进后退功能
栈是一种 后进先出(LIFO, Last In First Out) 的数据结构。也就是说,最后压入栈的数据会最先被取出。
栈的基本操作包括:
Push:将数据压入栈顶。
Pop:从栈顶弹出数据。
Peek/Top:查看栈顶数据,但不移除。
IsEmpty:检查栈是否为空。
栈的应用场景广泛,例如:
表达式求值与括号匹配。
深度优先搜索(DFS)。
实现递归。
浏览器前进后退功能。
Python 的列表(list
)天然支持栈的操作,可以通过 append
和 pop
方法实现。
class Stack:
def __init__(self):
self.stack = []
def push(self, data):
"""将数据压入栈"""
self.stack.append(data)
def pop(self):
"""从栈顶弹出数据"""
if not self.is_empty():
return self.stack.pop()
return "Stack is empty"
def peek(self):
"""查看栈顶数据"""
if not self.is_empty():
return self.stack[-1]
return "Stack is empty"
def is_empty(self):
"""检查栈是否为空"""
return len(self.stack) == 0
def size(self):
"""返回栈的大小"""
return len(self.stack)
# 测试栈
if __name__ == "__main__":
stack = Stack()
stack.push(10)
stack.push(20)
stack.push(30)
print("栈顶元素:", stack.peek()) # 输出: 栈顶元素: 30
print("弹出元素:", stack.pop()) # 输出: 弹出元素: 30
print("栈是否为空:", stack.is_empty()) # 输出: 栈是否为空: False
print("栈的大小:", stack.size()) # 输出: 栈的大小: 2
collections.deque
实现栈Python 的 collections.deque
是一个双端队列,具有更高效的栈操作。
from collections import deque
class Stack:
def __init__(self):
self.stack = deque()
def push(self, data):
self.stack.append(data)
def pop(self):
if not self.is_empty():
return self.stack.pop()
return "Stack is empty"
def peek(self):
if not self.is_empty():
return self.stack[-1]
return "Stack is empty"
def is_empty(self):
return len(self.stack) == 0
def size(self):
return len(self.stack)
# 测试栈
if __name__ == "__main__":
stack = Stack()
stack.push(100)
stack.push(200)
print("栈顶元素:", stack.peek()) # 输出: 栈顶元素: 200
stack.pop()
print("栈的大小:", stack.size()) # 输出: 栈的大小: 1
栈可以用来将中缀表达式转换为后缀表达式,并进行求值。
def evaluate_postfix(expression):
stack = Stack()
for char in expression:
if char.isdigit():
stack.push(int(char))
else:
b = stack.pop()
a = stack.pop()
if char == '+':
stack.push(a + b)
elif char == '-':
stack.push(a - b)
elif char == '*':
stack.push(a * b)
elif char == '/':
stack.push(a / b)
return stack.pop()
# 测试后缀表达式求值
expr = "23*54*+9-"
print("后缀表达式求值结果:", evaluate_postfix(expr)) # 输出: 17
def is_valid_parentheses(expression):
stack = Stack()
matching = {')': '(', ']': '[', '}': '{'}
for char in expression:
if char in "([{":
stack.push(char)
elif char in ")]}":
if stack.is_empty() or stack.pop() != matching[char]:
return False
return stack.is_empty()
# 测试括号匹配
expr1 = "(a+b)*[c-d]"
expr2 = "(a+b*[c-d)"
print("表达式1括号匹配:", is_valid_parentheses(expr1)) # 输出: True
print("表达式2括号匹配:", is_valid_parentheses(expr2)) # 输出: False
浏览器中,前进和后退操作可以通过两个栈实现。
class Browser:
def __init__(self):
self.back_stack = Stack()
self.forward_stack = Stack()
def visit(self, url):
if not self.back_stack.is_empty():
self.forward_stack = Stack() # 清空前进栈
self.back_stack.push(url)
def back(self):
if self.back_stack.size() > 1:
self.forward_stack.push(self.back_stack.pop())
return self.back_stack.peek()
return "No more pages to go back"
def forward(self):
if not self.forward_stack.is_empty():
url = self.forward_stack.pop()
self.back_stack.push(url)
return url
return "No more pages to go forward"
# 测试浏览器
browser = Browser()
browser.visit("google.com")
browser.visit("youtube.com")
browser.visit("github.com")
print("后退到:", browser.back()) # 输出: youtube.com
print("前进到:", browser.forward()) # 输出: github.com