1.队列的概念
队列(queue)是一种线性数据结构,与栈(stack)相反,符合先进先出的规则;
队列有头(queue_head),尾(queue_tail)与队列最大长度(Max_queue_length) 3个参数
例如:
第1步中,将1插入队列,此时队列长度为1;
the_queue[++tail] = 1;
第2,3,5,6步与第一步相似;
第4步中,将1弹出队列;
++queue_head;
注意:删除元素不需要真的删除,将queue_head增加1后,要删除的节点就不会再使用(循环队列或双端队列在插入到这位时,会直接覆盖)
要查询元素的数量,可以这样:
int queue_length = queue_tail - queue_head + 1;
2.队列的模板
我们可以把队列的操作封装成函数;
队列一般有push(),pop(),size(),front(),back()几个操作;
#include <bits/stdc++.h>
using namespace std;
#define Max_queue_length 100000 // 队列元素最大数量
typedef int queue_type; // 队列类型
queue_type the_queue[Max_queue_length + 1]; // 队列
int queue_head, queue_tail; // 队列的头和尾
bool push(queue_type x){
if(queue_tail == Max_queue_length)
return false; // 操作错误
the_queue[++queue_tail] = x;
return true; // 正常完成操作
}
bool pop(){
if(queue_head > queue_tail)
return false; // 操作错误
++queue_head;
return true; // 正常完成操作
}
int size(){
return queue_tail - queue_head + 1;
}
pair<queue_type, bool> interviews(int x){
if(size() < x || x < 1)
return make_pair(-1, false); // 操作错误
return make_pair(the_queue[queue_head + x - 1], true); // 正常完成操作
}
备注:
(1).interviews(int x)函数
此函数包含front()与back()函数的功能;
interviews(int x)函数的返回值有两部分,第一部分是访问出的值,第二部分是返回值的合法性,一般是这样写:
queue_type interviews(int x){
return the_queue[queue_head + x - 1];
}
(2).Max_queue_length
这里的Max_queue_length代表的是队列入队操作最多能有次
3.其他的队列
(1) 双端队列
双端队列(deque)其实就是指的队列两端都可以插入或删除;
#include <bits/stdc++.h>
using namespace std;
#define Max_queue_length 100000 // 队列元素最大数量
typedef int queue_type; // 队列类型
queue_type the_queue[Max_queue_length + 1]; // 队列
int queue_head, queue_tail; // 队列的头和尾
bool push_back(queue_type x){
if(queue_tail == Max_queue_length)
return false; // 操作错误
the_queue[++queue_tail] = x;
return true; // 正常完成操作
}
bool push_front(queue_type x){
if(queue_head == 1)
return false; // 操作错误
the_queue[--queue_head] = x;
return true; // 正常完成操作
}
bool pop_front(queue_type x){
if(queue_head > queue_tail)
return false; // 操作错误
++queue_head;
return true; // 正常完成操作
}
bool pop_back(queue_type x){
if(queue_head > queue_tail)
return false; // 操作错误
--queue_tail;
return true; // 正常完成操作
}
int size(){
return queue_tail - queue_head + 1;
}
pair<queue_type, bool> interviews(int x){
if(size() < x || x < 1)
return make_pair(-1, false); // 操作错误
return make_pair(the_queue[queue_head + x - 1], true); // 正常完成操作
}
(2) 循环队列
循环队列只是将队列的两端连起来以节省空间(这里写的是双端循环队列);
#include <bits/stdc++.h>
using namespace std;
#define Max_queue_length 100000 // 队列元素最大数量
typedef int queue_type; // 队列类型
queue_type the_queue[Max_queue_length + 1]; // 队列
int queue_head, queue_tail; // 队列的头和尾
bool push_back(queue_type x){
if(queue_tail == queue_head - 2 + (queue_head < 2 ? Max_queue_length : 0))
return false; // 操作错误
if(queue_tail == Max_queue_length)
queue_tail = 0;
the_queue[++queue_tail] = x;
return true; // 正常完成操作
}
bool push_front(queue_type x){
if(queue_head == ((queue_tail + 2) > Max_queue_length ? (queue_tail + 2) % Max_queue_length + 1 : queue_tail + 2))
return false; // 操作错误
if(queue_head == 0)
queue_head = Max_queue_length + 1;
the_queue[--queue_head] = x;
return true; // 正常完成操作
}
bool pop_front(queue_type x){
if(queue_head > queue_tail)
return false; // 操作错误
if(queue_head == Max_queue_length)
queue_head = 0;
++queue_head;
return true; // 正常完成操作
}
bool pop_back(queue_type x){
if(queue_head > queue_tail)
return false; // 操作错误
if(queue_tail == 0)
queue_tail = Max_queue_length;
--queue_tail;
return true; // 正常完成操作
}
int size(){
return (queue_tail >= queue_head ? queue_tail - queue_head + 1 : queue_tail + Max_queue_length - queue_head + 1);
}
pair<queue_type, bool> interviews(int x){
if(size() < x || x < 1)
return make_pair(-1, false); // 操作错误
return make_pair(the_queue[queue_head + x - 1 > Max_queue_length ? (queue_head + x - 1) % Max_queue_length + 1 : queue_head + x - 1], true); // 正常完成操作
}
(3).链式队列
链式队列(list_queue),顾名思义,就是用链表写成的队列,它其实是链表的一种,只是它的功能与队列相似,故为链式队列;
具体代码参考链表,此处不另附代码;
4.队列的作用
队列一般用作广度优先搜索(BFS),不同于栈,队列一般都是手写的,没有系统队列;
队列有时会与栈一起使用,但不常见;