下面是关于「栈和队列」这两个经典数据结构的完整讲解,包括原理、实现、常用操作、应用场景与典型例题,适用于蓝桥杯、数据结构课程与编程面试。
📚 目录
- 栈(Stack)
- 定义与特性
- 顺序栈与链式栈实现
- 常用操作
- 应用场景与典型题
- 队列(Queue)
- 定义与特性
- 顺序队列、链式队列、循环队列
- 常用操作
- 应用场景与典型题
- 栈与队列的区别与联系
- 蓝桥杯/LeetCode经典题汇总
1. ✅ 栈(Stack)
🔍 定义与特性
- 先进后出(LIFO):Last In First Out
- 操作只能在栈顶进行
- 常见操作:
push(x)
:压栈
pop()
:弹栈
top()
:查看栈顶元素
isEmpty()
:判断是否为空
🔧 顺序栈实现(数组版)
int stk[100], top = -1;
void push(int x) {
stk[++top] = x;
}
void pop() {
--top;
}
int getTop() {
return stk[top];
}
🧱 链式栈实现(链表)
struct Node {
int val;
Node* next;
};
Node* top = nullptr;
void push(int x) {
Node* node = new Node{x, top};
top = node;
}
void pop() {
Node* tmp = top;
top = top->next;
delete tmp;
}
🎯 应用场景
场景 | 说明 |
---|
括号匹配 | 左右括号入栈出栈是否匹配 |
表达式求值 | 后缀表达式、中缀转后缀 |
深度优先搜索(DFS) | 用栈代替递归 |
撤销功能 | 浏览器后退、文本编辑器撤销等 |
2. ✅ 队列(Queue)
🔍 定义与特性
- 先进先出(FIFO):First In First Out
- 入队在队尾,出队在队头
🔧 顺序队列实现(数组)
int q[100], front = 0, rear = 0;
void enqueue(int x) {
q[rear++] = x;
}
void dequeue() {
++front;
}
int getFront() {
return q[front];
}
🔁 循环队列(避免假溢出)
const int N = 100;
int q[N], front = 0, rear = 0;
bool isFull() { return (rear + 1) % N == front; }
bool isEmpty() { return front == rear; }
void enqueue(int x) {
if (!isFull()) {
q[rear] = x;
rear = (rear + 1) % N;
}
}
void dequeue() {
if (!isEmpty()) {
front = (front + 1) % N;
}
}
🎯 应用场景
场景 | 说明 |
---|
宽度优先搜索(BFS) | 图与树的层次遍历 |
消息队列、打印队列 | 任务排队 |
滑动窗口最值问题 | 单调队列优化 |
多线程中的生产者消费者模型 | 线程通信 |
3. 🆚 栈与队列对比总结
属性/操作 | 栈(Stack) | 队列(Queue) |
---|
操作方向 | 只在栈顶 | 头出尾进 |
数据特性 | 先进后出 LIFO | 先进先出 FIFO |
常见用途 | DFS、括号匹配等 | BFS、滑动窗口等 |
实现方式 | 顺序、链式栈 | 顺序、链式、循环队列 |
4. 📌 蓝桥杯/LeetCode经典题推荐
✅ 栈相关
- LeetCode 20. 有效的括号
- LeetCode 155. 最小栈
- LeetCode 739. 每日温度(单调栈)
- 蓝桥杯:栈操作模拟题(括号、表达式)
✅ 队列相关
- LeetCode 933. 最近请求次数(队列)
- LeetCode 239. 滑动窗口最大值(单调队列)
- 蓝桥杯:BFS 图遍历、最短路径问题
- 蓝桥杯:循环队列模拟问题(工位排队等)
📘 拓展学习建议
- 掌握 STL:C++ 中
stack<T>
与 queue<T>
、deque<T>
使用;
- 熟练写出手动实现模板(用于面试/竞赛);
- 深入应用:单调栈/队列、双端队列 deque、优先队列 priority_queue;
- 多刷题巩固,如力扣标签「栈」「队列」。
发表回复