一、队列及队列的常用操作
队列和栈不同。它虽然也是一个表,但是遵守“先进先出”的原则,简称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;
}