堆栈与队列
什么是堆栈和队列?
在计算机科学中,堆栈(Stack)和队列(Queue)是两种基本的数据结构,它们在程序设计中有广泛的应用。
堆栈(Stack)
堆栈是一种遵循后进先出(LIFO, Last In First Out)原则的线性表。这意味着最后插入堆栈中的元素将最先被移除。堆栈的主要操作包括入栈(push)、出栈(pop)和查看顶元素(top或peek)。在实际应用中,堆栈常用于函数调用、表达式求值以及撤销机制等方面。
队列(Queue)
队列则是一种遵循先进先出(FIFO, First In First Out)原则的线性表。这意味着最先插入队列中的元素将首先被移除。队列的主要操作包括入队(enqueue)、出队(dequeue)以及查看队首元素(front或peek)。在计算机科学中,队列常用于任务调度、打印队列管理等场景。
堆栈与队列的区别
-
数据访问模式:堆栈主要通过顶部进行操作;而队列通常只允许从一端插入和另一端删除。
-
应用场景:堆栈常用于撤销操作、括号匹配等问题;队列适用于任务调度等场景。
堆栈与队列的应用实例
递归调用的实现
在编程中,堆栈常被隐式地用来支持递归函数的调用。每当一个函数被调用时,其当前状态会被压入堆栈,并且当该函数返回时,它的状态从堆栈中弹出。
def recursive_function(n):
if n == 0:
return 1
else:
result = n * recursive_function(n - 1)
print(result) # 打印过程中的递归调用结果
return result
recursive_function(5)
表达式求值
堆栈可以用来实现中缀表达式的解析和求值。通过将操作数压入堆栈,运算符用于触发两个元素的操作并返回结果。
def evaluate_expression(expression):
operators = {'+': lambda x, y: x + y,
'-': lambda x, y: x - y}
stack = []
for token in expression:
if token.isdigit():
stack.append(int(token))
elif token in operators:
b, a = stack.pop(), stack.pop()
result = operators[token](a, b)
stack.append(result)
return stack[0]
expression = "3 + 5 - 2"
print(evaluate_expression(expression.split()))
队列的应用
队列可以用于模拟打印任务的排队,其中每个新任务被添加到队列尾部,并且下一个要处理的任务总是队列中的第一个。
from collections import deque
def print_tasks(tasks):
queue = deque()
for task in tasks:
queue.append(task)
if len(queue) > 3: # 限制最多等待的打印任务数量
oldest_task = queue.popleft()
print(f"Printing {oldest_task}")
print_tasks(["文档1", "表格2", "报告3", "图片4"])
堆栈和队列是数据结构的基础组成部分,它们各自的特点使得它们在不同的场景下能够发挥独特的作用。理解这些基础概念对于编写高效且易于维护的代码至关重要。