数据结构:栈与队列
栈和队列是两种常见的数据结构,用于管理数据的存储和访问方式。它们都属于线性结构,但在操作规则和应用场景上有显著差异。
栈(Stack)
栈是一种遵循**后进先出(LIFO)**原则的数据结构。最后插入的元素最先被移除。栈的基本操作包括:
- Push(压栈):将元素添加到栈顶。
- Pop(出栈):移除并返回栈顶元素。
- Peek/Top(查看栈顶):返回栈顶元素但不移除。
- isEmpty(判空):检查栈是否为空。
实现方式:
- 数组实现:通过固定大小的数组和栈顶指针实现。
- 链表实现:使用链表的头部作为栈顶,动态调整大小。
应用场景:
- 函数调用栈(递归调用)。
- 表达式求值(如括号匹配)。
- 浏览器历史记录(后退功能)。
队列(Queue)
队列是一种遵循**先进先出(FIFO)**原则的数据结构。最先插入的元素最先被移除。队列的基本操作包括:
- Enqueue(入队):将元素添加到队尾。
- Dequeue(出队):移除并返回队首元素。
- Front(查看队首):返回队首元素但不移除。
- isEmpty(判空):检查队列是否为空。
实现方式:
- 数组实现:使用循环数组解决空间浪费问题。
- 链表实现:通过维护头尾指针实现动态调整。
变种队列:
- 双端队列(Deque):两端均可进行插入和删除。
- 优先队列(Priority Queue):元素按优先级出队。
应用场景:
- 任务调度(如打印队列)。
- 消息队列(异步通信)。
- 广度优先搜索(BFS)算法。
栈与队列的对比
| 特性 | 栈 | 队列 |
|---|---|---|
| 操作原则 | LIFO(后进先出) | FIFO(先进先出) |
| 插入位置 | 栈顶 | 队尾 |
| 删除位置 | 栈顶 | 队首 |
| 典型应用 | 递归、括号匹配 | 任务调度、BFS |
代码示例(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 is_empty(self):
return len(self.items) == 0
队列的实现(链表):
class Node:
def __init__(self, data):
self.data = data
self.next = None
class Queue:
def __init__(self):
self.front = None
self.rear = None
def enqueue(self, item):
new_node = Node(item)
if self.rear is None:
self.front = new_node
self.rear = new_node
else:
self.rear.next = new_node
self.rear = new_node
def dequeue(self):
if self.front is None:
return None
temp = self.front
self.front = temp.next
if self.front is None:
self.rear = None
return temp.data
总结
栈和队列是基础但强大的数据结构,理解其特性和实现方式有助于解决特定问题。栈适合需要回溯的场景,而队列适合顺序处理的场景。根据需求选择合适的数据结构能显著提升算法效率。