队列简介
队列是用来存储暂未处理但需要按一定顺序处理的元素的一种数据结构,是一种先进先出(First In First Out, FIFO)的线性表,特点是先进队的元素先出队。它只允许在表的一段进行插入,而在另一端删除元素,这好比我们日常生活中的排队购物。在队列中,允许插入的一段叫做队尾,允许删除的一段叫做队首。
图1.0 队列示意图
队列的实现
- 顺序表 :用来储存队列中的元素, 是储存元素的最大容量。
- 队首指针 :指向队首元素存储位置。
- 队尾指针 :指向队尾元素的下一个存储位置 。
队列的基本操作
- 队列初始化: 。
- 判断队列是否为空:如果 ,则队列为空。
- 判断队列是否已满:如果 ,则队列已满。
- 进队(插入元素 ):如果队列未满,执行 。
- 出队:如果队列不为空,返回首元素 ,同时 。
- 队列中元素个数: 。
图1.1 队列基本操作示意图
队列的代码实现
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAXN 100
typedef int DataType;
struct Queue {
int front, rear; // 队首和队尾
DataType queue[MAXN]; // 队列
void Init() { // 初始化
front = 0;
rear = 0;
memset(queue, 0, sizeof queue);
}
bool Empty() { // 是否为空
return front == rear;
}
bool Full() { // 是否已满
return rear == MAXN;
}
int Size() { // 队列大小
return rear - front;
}
bool Push(DataType value) { // 进队
if (Full())
return false;
queue[rear++] = value;
return 1;
}
bool Pop() { // 出队
if (Empty())
return true;
++front;
return true;
}
DataType Front() { // 返回队首元素
if (Empty())
return queue[front];
return queue[front];
}
Queue() {
Init();
}
};
int main() {
Queue q;
cout << q.Empty() << endl;
q.Push(0);
cout << q.Front() << endl;
q.Push(1);
q.Pop();
cout << q.Front() << endl;
return 0;
}
循环队列简介
如图 ,我们发现,在 之后,再把新元素插入队列是不可能实现的,因为队尾指针 已经超出了数组的上界,而实际队列并未占满。为了充分利用空间不造成浪费,我们可以将顺序队列看作是循环的,即对于队列 来说,数组下标 可以看作是 的下一个位置。
图1.2 循环队列示意图
循环队列的实现
循环队列的实现 同 顺序队列 是一样的。
循环队列的基本操作
- 队列初始化 和 判断队列是否为空:与顺序队列相同。
- 判断队列是否已满:如果 ,即 的下一个位置是 ,则队列已满。
- 进队(插入元素 ):如果队列未满,执行 ; 。
- 出队:如果队列不为空,返回首元素 ,同时 。
- 队列中元素个数: 。
循环队列的代码实现
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAXN 100
typedef int DataType;
struct Queue {
int front, rear; // 队首和队尾
DataType queue[MAXN]; // 队列
void Init() { // 初始化
front = 0;
rear = 0;
memset(queue, 0, sizeof queue);
}
void Clear() { // 清空
front = 0;
rear = 0;
}
bool Empty() { // 是否为空
return front == rear;
}
bool Full() { // 是否已满
return (rear + 1) % MAXN == front;
}
int Size() { // 队列大小
return (rear - front + MAXN) % MAXN;
}
bool Push(DataType value) { // 进队
if (Full())
return false;
queue[rear++] = value;
rear %= MAXN;
return true;
}
bool Pop() { // 出队
if (Empty())
return false;
++front;
front %= MAXN;
return true;
}
DataType Front() { // 返回队首元素
if (Empty())
return queue[front];
return queue[front];
}
Queue() {
Init();
}
};
int main() {
Queue q;
for (int i = 0; i < 120; i++) {
q.Push(1);
q.Pop();
}
cout << q.Empty() << endl;
q.Push(0);
cout << q.Front() << endl;
q.Push(1);
cout << q.Size() << endl;
q.Pop();
cout << q.Front() << endl;
cout << q.Empty() << endl;
return 0;
}
参考书籍:《CCF 中学生程序设计——基础篇》
个人 OI 水平有限,请见谅。