int dequeue() {
if (isEmpty()) {
cout << "Queue is Empty" << endl;
return -1;
}
int item = arr[front];
if (front == rear) {
front = rear = -1;
} else {
front = (front + 1) % capacity;
}
size--;
return item;
}
注意事项:
Front操作:
int front() {
if (isEmpty()) {
cout << "Queue is Empty" << endl;
return -1;
}
return arr[front];
}
注意事项:
int back() {
if (isEmpty()) {
cout << "Queue is Empty" << endl;
return -1;
}
return arr[rear];
}
bool isEmpty() {
return (front == -1 && rear == -1);
}
int size() {
if (isEmpty()) return 0;
return size;
}
bool isFull() {
return ((rear + 1) % capacity == front);
}
void clear() {
front = rear = -1;
size = 0;
}
数组实现队列:
实现代码:
class ArrayQueue {
private:
int* arr;
int capacity;
int front;
int rear;
int size;
public:
ArrayQueue(int cap) {
capacity = cap;
arr = new int[capacity];
front = rear = -1;
size = 0;
}
bool isEmpty() {
return front == -1;
}
bool isFull() {
return (rear + 1) % capacity == front;
}
void enqueue(int item) {
if (isFull()) return;
if (isEmpty()) {
front = rear = 0;
} else {
rear = (rear + 1) % capacity;
}
arr[rear] = item;
size++;
}
int dequeue() {
if (isEmpty()) return -1;
int item = arr[front];
if (front == rear) {
front = rear = -1;
} else {
front = (front + 1) % capacity;
}
size--;
return item;
}
};
数组实现的优缺点:
优点:
缺点:
适用场景:
链表实现队列:
实现代码:
struct Node {
int data;
Node* next;
Node(int d) : data(d), next(nullptr) {}
};
class LinkedListQueue {
private:
Node* front;
Node* rear;
int size;
public:
LinkedListQueue() {
front = rear = nullptr;
size = 0;
}
bool isEmpty() {
return front == nullptr;
}
void enqueue(int item) {
Node* temp = new Node(item);
if (isEmpty()) {
front = rear = temp;
} else {
rear->next = temp;
rear = temp;
}
size++;
}
int dequeue() {
if (isEmpty()) return -1;
Node* temp = front;
int item = temp->data;
front = front->next;
if (front == nullptr) {
rear = nullptr;
}
delete temp;
size--;
return item;
}
};
链表实现的优缺点:
优点:
缺点:
适用场景:
循环队列:
实现代码:
class CircularQueue {
private:
int* arr;
int capacity;
int front;
int rear;
int size;
public:
CircularQueue(int cap) {
capacity = cap;
arr = new int[capacity];
front = rear = -1;
size = 0;
}
bool isEmpty() {
return front == -1;
}
bool isFull() {
return (rear + 1) % capacity == front;
}
void enqueue(int item) {
if (isFull()) return;
if (isEmpty()) {
front = 0;
}
rear = (rear + 1) % capacity;
arr[rear] = item;
size++;
}
int dequeue() {
if (isEmpty()) return -1;
int item = arr[front];
if (front == rear) {
front = rear = -1;
} else {
front = (front + 1) % capacity;
}
size--;
return item;
}
};
循环队列的特性:
核心思想:
优势:
注意事项:
(rear + 1) % capacity == frontfront == -1STL队列:
#include <queue>基本用法:
#include <queue>
#include <iostream>
using namespace std;
int main() {
queue<int> q;
// 入队操作
q.push(10);
q.push(20);
q.push(30);
// 访问队头
cout << "Front: " << q.front() << endl;
// 出队操作
q.pop();
cout << "Front after pop: " << q.front() << endl;
// 队列大小
cout << "Size: " << q.size() << endl;
return 0;
}
STL队列操作:
主要成员函数:
push():在队尾插入元素pop():删除队头元素front():返回队头元素back():返回队尾元素empty():检查队列是否为空size():返回队列大小性能特点:
使用建议:
进程调度:
打印队列:
消息队列:
数据包排队:
请求队列:
缓冲区管理:
广度优先搜索(BFS):
缓存淘汰算法:
任务调度算法:
问题描述:
使用队列实现图的广度优先搜索
算法思路:
代码实现:
void BFS(int start, vector<vector<int>>& graph) {
vector<bool> visited(graph.size(), false);
queue<int> q;
visited[start] = true;
q.push(start);
while (!q.empty()) {
int current = q.front();
q.pop();
cout << current << " ";
for (int neighbor : graph[current]) {
if (!visited[neighbor]) {
visited[neighbor] = true;
q.push(neighbor);
}
}
}
}
BFS特性分析:
时间复杂度:
空间复杂度:
应用场景:
队列的作用:
问题描述:
给定数组和窗口大小,求每个窗口的最大值
算法思路:
使用双端队列维护窗口内的最大值索引
代码实现:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> result;
deque<int> dq;
for (int i = 0; i < nums.size(); i++) {
// 移除超出窗口的元素
if (!dq.empty() && dq.front() == i - k) {
dq.pop_front();
}
// 维护递减队列
while (!dq.empty() && nums[dq.back()] < nums[i]) {
dq.pop_back();
}
dq.push_back(i);
// 记录窗口最大值
if (i >= k - 1) {
result.push_back(nums[dq.front()]);
}
}
return result;
}
算法分析:
时间复杂度:
空间复杂度:
关键技巧:
队列变种:
问题描述:
设计循环队列,支持enqueue、dequeue等操作
设计要点:
完整实现:
class MyCircularQueue {
private:
vector<int> data;
int head;
int tail;
int size;
int capacity;
public:
MyCircularQueue(int k) {
data.resize(k);
head = -1;
tail = -1;
size = 0;
capacity = k;
}
bool enQueue(int value) {
if (isFull()) return false;
if (isEmpty()) {
head = 0;
}
tail = (tail + 1) % capacity;
data[tail] = value;
size++;
return true;
}
bool deQueue() {
if (isEmpty()) return false;
if (head == tail) {
head = tail = -1;
} else {
head = (head + 1) % capacity;
}
size--;
return true;
}
int Front() {
if (isEmpty()) return -1;
return data[head];
}
int Rear() {
if (isEmpty()) return -1;
return data[tail];
}
bool isEmpty() {
return size == 0;
}
bool isFull() {
return size == capacity;
}
};
实现细节:
边界处理:
指针移动:
测试用例:
预分配空间:
对象池技术:
内存对齐:
批量操作:
无锁队列:
缓存友好:
优先级队列:
延迟队列:
阻塞队列:
基本概念:
实现方式:
时间复杂度:
循环队列的实现:
BFS算法中的队列:
多线程队列:
题目1:队列基本操作
题目2:循环队列实现
题目3:BFS遍历
题目4:滑动窗口最大值
题目5:多线程队列
题目6:优先级队列应用
LeetCode相关题目:
算法竞赛经典:

联系方式:
演讲者备注不会在演示模式中显示给观众,仅供演讲者参考。 每个关键页面都添加了备注,帮助演讲者更好地讲解内容。
封面页: - 欢迎学生,简要介绍本次课程的主题和目标 - 强调队列在数据结构和算法中的重要性 - 本讲义将从基本概念到实际应用,系统讲解队列的原理和应用
目录页: - 简要介绍讲义结构 - 队列的基本概念、操作、实现、应用、例题等
转场页: - 介绍队列的基本概念 - 引入FIFO原理
队列的定义: - 基础知识介绍 - 与其他数据结构的区别
转场页: - 介绍队列的基本操作 - 引入enqueue、dequeue等核心操作
转场页: - 介绍队列的不同实现方式 - 包括数组、链表、循环队列等
转场页: - 介绍队列在实际中的应用 - 包括操作系统、网络、算法等
转场页: - 介绍队列相关的经典问题 - 包括算法竞赛和实际应用
转场页: - 介绍队列使用的优化技巧 - 提高性能和效率
转场页: - 总结队列的核心知识点 - 强调重点和难点
转场页: - 提供练习题供学生巩固 - 包括基础题和进阶题