队列基础代码与模板整理

队列\(_{queue}\)

一种基本的数据结构

这里我们只讲普通队列/普通队列进阶,非常简单,非常基础,不讲更高层次的队列,不要恐慌.

本质:一种线性表.

特性:"先进先出",类比排队

普通队列

用于手动实现の材料:

  1. 队列本体(数组)

  2. 头指针,指向对头元素的前一个位置(一个变量或一个指针)

    或者直接理解为,头指针下一个要指到的就是队头元素

  3. 尾指针,指向队中最后一个元素的位置(同头指针)

    可以理解为"最新元素的位置"

就是这样

设共有\(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);
		}
	}; 
} 
posted @ 2020-05-02 16:45  _Alex_Mercer  阅读(322)  评论(0编辑  收藏  举报