C++ 队列(WZOI 846 模拟队列)

一、队列及队列的常用操作

队列和栈不同。它虽然也是一个表,但是遵守“先进先出”的原则,简称FIFO(First in first out)表。队列和栈一样,都是从一头进出。如果把栈比作一个桶,不停往里面放东西,那么队列就像个水管,不停往一头塞东西。需要时,就把东西一件件倒出来。水管塞进东西的那一头叫队尾,倒出东西的那一头叫队头。注意,栈是从栈顶插入元素,队列是从队尾插入元素。队列和栈相同,无法用下标访问,更无法遍历。请不要试图这么做。

队列的定义方法:queue<typename> Variable_Name

Typename代表队列内存储的元素类型,比如queue <int> 就是队列内存储int类型的数据。Variable_Name是队列名。

队列有以下几种常用操作:

1.front():返回队首元素,队列为空则无效

2.back():返回队尾元素,队列为空则无效

3.push():从队尾插入元素,无返回值

4.pop():弹出队首元素,无返回值,队列为空则无效

5.empty():判断队列是否为空,为空返回true,不为空返回false

6.size():返回队列中元素个数

在使用这些操作时,需要用句点运算符将操作对象与操作关联起来。比如定义了两个队列queue<int> q1,q2;q1.push(7);就是在q1的队尾插入元素7,cout << q2.empty();就是输出q2是否为空。

二、模拟队列的方法

数组模拟队列

通常用数组模拟队列。用ql和qr模拟队头和队尾,qr-ql就是队列元素数量。

#include <bits/stdc++.h>
using namespace std;
int a[10000010], ql = 0, qr = 0;
int main(){
	a[ql]; // 等同于a.front();
	a[qr]; // 等同于a.back();
	a[++qr] = 5; // 等同于a.push(5);
	ql++; // 等同于a.pop();
	if(ql == qr); // 等同于if(a.empty());
	qr-ql; // 等同于a.size();
	return 0;
}

用数组模拟队列有一个缺陷,就是定义一个长度为10000010的数组后,如果删除和添加了n个元素,就算队列队头还有多余,qr的值还是10000009,数组存不下。解决方法是把数组的头和尾连接成一个环,第n+1个元素存储在下标0的位置。

三、WZOI 846 模拟队列
 

#include<bits/stdc++.h>
using namespace std;
long long a[100010], M, x, r = 0, l = 0, p = 0;
string s;
int main(){
	cin >> M;
	for(int i = 1; i <= M; i++){
		cin >> s;
		if(s == "push"){
			cin >> x;
			a[p] = x;
			p++; r++;
		}
		if(s == "pop"){
			l++;
		}
		if(s == "empty"){
			if(r - l == 0) cout << "YES\n";
			else cout << "NO\n";
		}
		if(s == "query"){
			cout << a[l] << endl;
		}
	}
	return 0;
}

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值