队列
简介(Introduction)
队列是一种特殊的线性表,允许在表的前端 \(front\) 进行删除操作,而在表的后端 \(rear\) 进行插入操作。
进行插入操作的端称为队尾,进行删除操作的端称为队头。
描述(Description)
- 队列是一种 先进先出 的结构
- 类似于人们的排队,先排队的人一定是在队列的前面,会先离开;反之,后来排队的人一定在队列后面,会后离开。
示例(Example)
代码(Code)
// 循环队列
int q1[N], front1, rear1; // 1. front 指向第一个元素,rear 指向最后一个元素的下一个位置
int q2[N], front2, rear2 = -1; // 2. front 指向第一个元素,rear 指向最后一个元素
// 队列为空
front1 == rear1; // 1
front2 == (rear2 + 1) % N; // 2
// 判满
front1 == (rear1 + 1) % N; // 1
front2 == (rear2 + 2) % N; // 2
// 入队
q1[rear1 ++ ] = 1; // 1
rear1 %= N;
q2[ ++ rear2] = 1; // 2
rear2 %= N;
// 出队
front1 = (front1 + 1) % N; // 1 = 2
front2 = (front2 + 1) % N;
// 队头
q1[front1]; // 1 == 2
q2[front2];
#include <cstdio>
#include <iostream>
using namespace std;
struct Node {
int val;
Node *next;
Node() : next(NULL) {}
Node(int _val) : val(_val), next(NULL) {}
};
void print(Node *front) {
for (auto i = front; i->next; i = i->next)
cout << i->val << ' ';
cout << endl;
}
int main() {
Node *front = new Node(), *rear = front;
// 入队
rear->val = 1;
rear = rear->next = new Node(); // rear 指向最后一个元素队下一个元素
rear->val = 2;
rear = rear->next = new Node();
rear->val = 3;
rear = rear->next = new Node();
print(front);
// 出队
auto p = front;
front = front->next;
delete(p);
print(front);
// 队头
cout << front->val << endl;
return 0;
}
一般情况下,链式存储 的队列无需使用循环队列的形式。
其原因是:链式存储在插入、删除操作中没有空余的节点,不会造成空间浪费