Python数据结构与算法中的栈详解(1)
简介
在Python中,栈(Stack)是一种常用的数据结构,该数据结构为一种先进后出(FILO,即First In Last Out)的结构。
举个例子,如同叠盘子一般,你叠一个盘子在另一个盘子上,你只能往上盖盘子,只有最上面的盘子能够被取下,下面的盘子只有等到上面的盘子被取下,才能够被取下来。
栈的特点
栈的特点可以总结为以下三点:
- 只能在表尾进行插入和删除操作。
- 栈中的元素具有后进先出的特点。
- 在栈中,除了栈顶元素之外,没有任何一个元素能够直接访问。
Python中栈的实现
列表实现
Python中可以通过列表的操作实现栈,使用append
函数模拟入栈操作,使用pop
函数模拟出栈操作。
stack = []
# 入栈操作
stack.append(1)
stack.append(2)
stack.append(3)
# 出栈操作
print(stack.pop()) # 输出3
print(stack.pop()) # 输出2
print(stack.pop()) # 输出1
queue模块实现
Python中还可以借助queue模块实现栈。
import queue
stack = queue.LifoQueue()
# 入栈操作
stack.put(1)
stack.put(2)
stack.put(3)
# 出栈操作
print(stack.get()) # 输出3
print(stack.get()) # 输出2
print(stack.get()) # 输出1
以上两种方式都可以实现栈的基本操作,在实现中需要注意栈空和栈满的情况。
实际应用
括号匹配问题
括号匹配问题是一个经典的应用场景,判断一个字符串中的各个括号是否为匹配的括号。
例如({[()]})
是匹配的,({[]})}
是不匹配的。
代码实现:
def match_brackets(s):
stack = []
brackets = {'(':')', '{':'}', '[':']'}
for c in s:
if c in brackets: # 左括号入栈
stack.append(c)
elif stack and c == brackets[stack[-1]]: # 匹配的右括号出栈
stack.pop()
else:
return False
return not stack # 如果栈为空则说明全部匹配
栈的运用
栈的应用非常广泛,例如计算器就可以利用栈来实现。以下示例为利用栈解决逆波兰表达式的问题。
在逆波兰表达式中,操作符在操作数之后。例如:
2 1 + 3 *
等价于
(2 + 1) * 3 = 9
代码实现:
def eval_rpn(tokens):
stack = []
operations = {
"+": lambda x, y: x + y,
"-": lambda x, y: x - y,
"*": lambda x, y: x * y,
"/": lambda x, y: int(x / y)
}
for token in tokens:
if token in operations:
a, b = stack.pop(), stack.pop()
stack.append(operations[token](b, a))
else:
stack.append(int(token))
return stack[0]
总结
本文通过介绍栈的定义和特点,了解了Python中栈的基本实现方式,并通过示例代码展示了栈在实际应用中的使用。在Python中,栈的应用非常广泛,如果想要成为一个优秀的Python程序员,栈应该是必须要掌握的基本单元之一。