队列——模拟队列

知识点

队列 queue 是 OI 中常用的一个线性数据结构。队列中添加和删除数据的操作分别是在两端进行的。就和“队列”这个名字一样,把它想象成排成一队的人更容易理解。在队列中,处理总是从第一名开始往后进行,而新来的人只能排在队尾。
插入时间复杂度:O(1)。
删除时间复杂度:O(1)。
遍历时间复杂度:队列理论上不支持遍历操作。
队列 是仅限在 一端 进行 插入,另一端 进行 删除 的 线性表。队列 又被称为 先进先出 (First In First Out) 的线性表,简称 FIFO 。
 


允许进行元素删除的一端称为 队首。如下图所示:
 


允许进行元素插入的一端称为 队尾。如下图所示:
 


队列的插入操作,叫做 入队。它是将 数据元素 从 队尾 进行插入的过程,如图所示,表示的是 插入 两个数据(绿色 和 蓝色)的过程:
 


队列的删除操作,叫做 出队。它是将 队首 元素进行删除的过程,如图所示,表示的是 依次 删除 两个数据(红色 和 橙色)的过程:
 


下图就是队列的概念图。现在队列中只有数据Blue。
 


然后,队列中添加了数据 Green,如下图。
 


紧接着,数据 Red 也入队了。如下图。
 


从队列中取出(删除)数据时,是从最下面,也就是最早入队的数据开始的。这里取出的是Blue。
 


如果再进行一次出队操作,取出的就是Green了。
 


像队列这种最先进去的数据最先被取来,即“先进先出”的结构,我们称为First In First Out,简称 FIFO。
在 OI 中,我们可以使用一维数组来模拟队列,也可以使用 STL 的 queue 来实现队列。这里,我们使用一维数组来模拟队列。

题目描述

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

  1. push x – 向队尾插入一个数 x;
  2. pop – 从队头弹出一个数;
  3. empty – 判断队列是否为空;
  4. query – 查询队头元素。(注:在 STL 的 queue 中,对应的功能函数是 front())

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

输入格式

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

输出格式

对于每个 empty 和 query 操作都要输出一个查询结果,每个结果占一行。
其中,empty 操作的查询结果为 YES 或 NO,query 操作的查询结果为一个整数,表示队头元素的值。

数据范围

1≤M≤100000,
1≤x≤109,
所有操作保证合法。

输入样例

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

输出样例

NO
6
YES
4

注释版代码

#include<iostream>
using namespace std;
const int N=100010;
//队列是先进先出:排队
int hh=0,tt=-1;//hh代表队列头,tt代表队列尾
//因为一开始0个数据,所以hh从0开始;tt只要有数进队列,就会变成0
int q[N],x;
void push(int x)
{
	q[++tt]=x;
}
void pop()
{
	hh++;
}
bool empty()
{
	if(hh<=tt)
	{
		return false;//当hh<=tt代表队列头和队列尾是有一段距离的,所以非空
	}
	return true;
}
int query()
{
	return q[hh];
}
int main()
{
	int m;
	scanf("%d",&m);
	while(m--)
	{
		string op;
		cin>>op;
		if(op=="push") cin>>x,push(x);
		else if(op=="pop") pop();
		else if(op=="empty")
		{
			if(empty())
			{
				printf("YES\n");
			}
			else printf("NO\n");
		}
		else if(op=="query")
		printf("%d\n",query());
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值