队列模板

模板

1.普通队列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

// hh 表示队头,tt表示队尾
int q[N], hh = 0, tt = -1;

// 向队尾插入一个数
q[ ++ tt] = x;

// 从队头弹出一个数
hh ++ ;

// 队头的值
q[hh];

// 判断队列是否为空
if (hh <= tt)
{

}



2.循环队列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

// hh 表示队头,tt表示队尾的后一个位置
int q[N], hh = 0, tt = 0;

// 向队尾插入一个数
q[tt ++ ] = x;
if (tt == N) tt = 0;

// 从队头弹出一个数
hh ++ ;
if (hh == N) hh = 0;

// 队头的值
q[hh];

// 判断队列是否为空
if (hh != tt)
{

}


题目描述:

实现一个队列,队列初始为空,支持四种操作:

  • 1.push x – 向队尾插入一个数 x;
  • 2.pop – 从队头弹出一个数;
  • 3.empty – 判断队列是否为空;
  • 4.query – 查询队头元素。

现在要对队列进行 M 个操作,其中的每个操作 3 和操作 4 都要输出相应的结果。

输入格式
第一行包含整数 M,表示操作次数。

接下来 M 行,每行包含一个操作命令,操作命令为 push x,pop,empty,query 中的一种。

输出格式
对于每个 empty 和 query 操作都要输出一个查询结果,每个结果占一行。

其中,empty 操作的查询结果为 YES 或 NO,query 操作的查询结果为一个整数,表示队头元素的值。

数据范围

1≤M≤100000,
1≤x≤10^9,
所有操作保证合法。

输入样例:

10
push 6
empty
query
pop
empty
push 3
push 4
pop
query
push 6

输出样例:

NO
6
YES
4


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>

using namespace std;
const int N = 100010;

int m;
int q[N], hh, tt = -1;

int main(){
cin >> m;
while (m--){
string op;
int x;

cin >> op;
if(op == "push"){
cin >> x;
q[ ++ tt] = x;
}
else if(op == "pop") hh++;
else if(op == "empty") cout << (hh <= tt ? "NO" :"YES") <<endl;
else cout << q[hh] <<endl;
}
return 0;
}




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include<string.h>
#define N 100010

int m;
int q[N], hh, tt = -1;

int main(){
scanf("%d",&m);
while (m--){
char op[10];
int x;

scanf("%s",op);
if(!strcmp(op,"push")){
scanf("%d",&x);
q[ ++ tt] = x;
}
else if(!strcmp(op,"pop")) hh++;
else if(!strcmp(op,"empty")) printf("%s\n",(hh <= tt ? "NO" :"YES"));
else printf("%d\n",q[hh]);
}
return 0;
}