队列基础代码与模板整理
队列\(_{queue}\)
一种基本的数据结构
这里我们只讲普通队列/普通队列进阶,非常简单,非常基础,不讲更高层次的队列,不要恐慌.
本质:一种线性表.
特性:"先进先出",类比排队
普通队列
用于手动实现の材料:
-
队列本体(数组)
-
头指针,指向对头元素的前一个位置(一个变量或一个指针)
或者直接理解为,头指针下一个要指到的就是队头元素
-
尾指针,指向队中最后一个元素的位置(同头指针)
可以理解为"最新元素的位置"
就是这样
设共有\(t\)次操作,下面\(t\)行每行两个数字,
第一个\(opr\),第二个\(num\),
\(opr\)=1则为插入操作,\(opr\)=2则为弹出操作,后面的\(num\)是插入/弹出的数值
最基础的队列代码实现:
#include<iostream>
#include<cstdio>
using namespace std;
const int N=100005;
int t;
int q[N];
int head=0,tail=0;
int main(){
scanf("%d",&t);
while(t){
--t;
int opr,num;
scanf("%d",&opr);
if(opr==1){
scanf("%d",&num);
q[++tail]=num;
}
else
printf("%d",q[++head]);
};
}
成了...
循环队列
重复利用曾被释放的空间
通过取模完成指针的循环操作
#include<iostream>
#include<cstdio>
using namespace std;
const int N=100005;
int t;
int q[N];
int head=0,tail=0;
int main(){
scanf("%d",&t);
while(t){
--t;
int opr,num;
scanf("%d",&opr);
if(opr==1){
scanf("%d",&num);
if(++tail>100000)
tail=tail%4+1;
q[tail]=num;
}
else{
if(++head>100000)
head=head%4+1;
printf("%d",q[head]);
}
};
}
最重要而基础的部分
STL中queue的实现
有STL为什么要自己手动实现呢QAQ
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N=100005;
int t;
queue<int> q;
int main(){
scanf("%d",&t);
while(t){
--t;
int opr,num;
scanf("%d",&opr);
if(opr==1){
scanf("%d",&num);
q.push(num);
}
else{
int a=q.front();
q.pop();
printf("%d\n",a);
}
};
}