数组模拟队列和数组模拟栈其实很类似,都是用一个数组来存储元素,用指针表示当前可以操作的位置。
区别就是栈只能在栈顶进行操作,所以只需要有一个top
指针指向栈顶。
而队列可以在队头和队尾都进行操作(出队、入队),所以需要两个指针head
和tail
指向队头和队尾。
如果有元素入队,则tail加一,指向新元素。
如果要出队,则head加一,指向原来队列的第二个元素,这个元素就是现在的对头。
具体代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int q[N], head, tail; //用数组q模拟队列,head和tail分别指向队头和队尾
void init() {
head = 0; //初始时head和tail都指向0,表示没有元素
tail = 0;
}
void Push(int x) {
q[++tail] = x; //tail加一,新元素加在tail指针指向的位置
}
void Pop() {
++head;
}
int Query() {
return q[head + 1]; //注意要有加一
}
string Empty() {
if(head < tail) {
return "NO";
} else {
return "YES";
}
}
int main() {
int M;
cin >> M;
init();
while(M--) {
string op;
int x;
cin >> op;
if(op == "push") {
cin >> x;
Push(x);
} else if(op == "empty") {
cout << Empty() << endl;
} else if(op == "query") {
cout << Query() << endl;
} else if(op == "pop") {
Pop();
}
}
}