【普及】数据结构 - 队列(queue)
1. 定义
队列($queue$),一种运算操作受限的线性表。
限定在表的前端($head$)进行删除操作,而在表的后端($end$)进行插入操作。
-
进行插入操作的端称为队尾,进行删除操作的端称为队头。
-
队列中没有元素时,称为空队列。
2. 代码
$(1)$ 数组模拟
①定义
int a[N], head = 0, end = 0; //定义一个整型队列,此时头指针与尾指针均指向0,代表队列为空
//head 为队首指针、end 为队尾指针
②入队列
void push(int x){
a[end] = x; //将x入队
end ++; //队尾指针后移一位
}
③出队列
void pop(){
head ++; //队首指针后移一位
}
④返回队首元素
int front(){
return a[hend]; //返回队首元素
}
⑤返回队尾元素
int back(){
return a[end - 1]; //返回队尾元素
}
⑥返回队中元素个数(队的长度)
int size(){
return end - head;
//队尾指针减队首指针即为队列的长度
}
⑦判断队列是否为空
bool empty(){
if(head >= end) return true;
//队首指针大于或等于队尾指针,该队列为空,返回 真/1/true
return false;
//否则队首指针小于队尾指针,该队列不为空,返回 假/0/false
}
⑧遍历队
int a[N], head = 0, end = 0;
for(int i = 1; i <= n; i ++){ //入队
int x;
cin >> x;
push(x);
}
while(!empty()){ //方案1.出队
cout << front();
pop();
}
while(size()){ //方案2.出队
cout << front();
pop();
}
⑨返回队中第 $i$ 个元素(数组模拟特有功能)
int queue_i(int i){
return a[i - 1];
//数组模拟队列的优势在于可以通过数组下标,在 O(1) 的时间里,找到第 i 个元素
//此时,第 1 个元素存在 a[0] 中,所以第 i 个元素存在 a[i - 1]中
}
$(2)$ $STL$模板
①定义
#include<queue> //引用 queue 头文件
queue<int> a; //定义一个整型队列
queue<string> s; //定义一个字符串队列
queue<node> b; //定义一个结构体队列
②入队
a.push(x);
③出队
a.pop();
④返回队头元素
int x = a.front();
④返回队尾元素
int x = a.back();
⑤返回队中元素个数(队的长度)
int len = a.size();
⑥判断队是否为空
bool b = a.empty();
⑦遍历队
queue<int> a;
for (int i = 1; i <= n; i ++) a.push(i); //入队
while(!a.empty()){ //方案1.出队
cout << a.front() << "\n"; //队首元素
a.pop();
}
while(a.size()){ //方案2.出队
cout << a.front() << "\n"; //队首元素
a.pop();
}
```- [ ]