引入:
队列(queue)是一种具有「先进入队列的元素一定先出队列」性质的表。由于该性质,队列通常也被称为先进先出(first in first out)表,简称 FIFO 表。
就像排队取餐一样,先来排队的会先拿到餐,并先离开,而后来排队的后那到餐,并后离开。
队列的实现:
数组模拟队列:
一般用两个边量,一个表示对头(pl),一个表示队尾(pr)
int q[N],pl=1,pr;
q[++pr]=a;//入队
pl++;//弹出队头
q[ql];//访问队头
q[qr];//访问队尾
pl=1;pr=0;//清空队列
if(pr>0) //判断是否为空
双栈模拟队列:
这个方法比较少用,因为不是很好。。。那也满写一下。
首先我们需要两个栈,一个为栈a(队头的栈),栈b(队尾的栈)。它支持push操作,即在栈b入栈,pop操作,即在栈a中出栈。
- push:插入到栈b中
- pop:如果 a 非空,让 a 弹栈;否则,把 b 的元素一个一个弹出插入,做完后是首尾颠倒的。
,然后再让 S 弹栈。
(好麻烦啊~~~)
C++STL实现栈:
c++党已经高兴的不行了吧!
首先头文件别忘了#include<queue>(除非你用万能头~~~)
STL 中的 queue
较为常用的函数有:
q.front()
返回队首元素q.back()
返回队尾元素q.push()
在队尾插入元素q.pop()
弹出队首元素q.empty()
队列是否为空q.size()
返回队列中元素的数量
此外,queue
还提供了一些运算符。较为常用的是使用赋值运算符 =
为 queue
赋值,示例:
#include<bits/stdc++.h>
using namespace std;
int main(){
queue<int> q;//也可以定义为结构体
int n;cin>>n;
for(int i=1;i<=n;i++){//输入n个元素,并插入队列
int x;cin>>x;
q.push(x);
}
for(int i=1;i<=n;i++){//先进先出
int y=q.front();
q.pop();
cout<<y<<" ";
}
if(q.empty()) cout<<"empty!\n";//判断是否为空,返回true,则为空,否则相反
q.push(1);q.push(2);
int y=q.back();//查询队尾元素,并输出
cout<<y<<endl;
return 0;
}
特殊的队列:
C++STL中的双端队列:
depue就是stl中的双端队列,它类似于vector与queue的合体!
首先是头文件:#include<deque>
STL 中的 deque
较为常用的函数有:
q.front()
返回队首元素q.back()
返回队尾元素q.push_back()
在队尾插入元素q.pop_back()
弹出队尾元素q.push_front()
在队首插入元素q.pop_front()
弹出队首元素q.insert()
在指定位置前插入元素(传入迭代器和元素)q.erase()
删除指定位置的元素(传入迭代器)q.empty()
队列是否为空q.size()
返回队列中元素的数量
此外,deque
还提供了一些运算符。其中较为常用的有:
- 使用赋值运算符
=
为deque
赋值,类似queue
。 - 使用
[]
访问元素,类似vector
。
<queue>
头文件中还提供了优先队列 priority_queue
,因其与堆相似,若想学习请转到堆的文章。
示例:
#include<bits/stdc++.h>
using namespace std;
//这里主要是大家自己动手写写!
int main(){
deque<int> q;
int n;cin>>n;
for(int i=1;i<=n;i++){//若从前面入队列,类似一个栈
int x;cin>>x;
q.push_front(x);
}
int m;cin>>m;
for(int i=1;i<=m;i++){//若从后面入队列,类似队列QAQ
int x;cin>>x;
q.push_back(x);
}
if(q.empty()) cout<<"empty!\n";
else{
cout<<"fill!\n"<<q.size()<<"\n";
}
int len=q.size();
for(int i=1;i<=len;i++){
int y=q.front();
q.pop_front();
cout<<y<<" ";
}
cout<<endl;
q.push_front(1);q.push_front(2);
int y=q.back();
q.pop_back();
cout<<y;
return 0;
}
循环队列:
其实C++STL中的queue就是一个循环队列。
若用数组模拟循环队列:随着时间的推移,整个队列会向数组的尾部移动,一旦到达数组的最末端,即使数组的前端还有空闲位置,再进行入队操作也会导致溢出。
解决溢出的办法是采用循环的方式来组织存放队列元素的数组,即将数组下标为 x
的元素,它的后继为 (x + 1) % SIZE,
这样就形成了循环队列。
总结:
队列的基本实现与用法就讲到这了,若想灵活使用队列一定要多刷题哦!