用一个数组 q 保存数据。
用 hh 代表队头,q[hh] 就是队头元素, q[hh + 1] 就是第二个元素。
用 tt 代表队尾, q[tt] 就是队尾元素, q[tt + 1] 就是下一次入队,元素应该放的位置。
[hh, tt] 左闭右闭,代表队列中元素所在的区间。
操作如下:
出队pop:
因为 hh 代表队头,[hh, tt] 代表元素所在区间。所以出队可以用 hh++实现,hh++后,区间变为[hh + 1, tt]。
入队push:
因为 tt 代表队尾,[hh, tt] 代表元素所在区间。所以入出队可以用 tt++实现,hh++后,区间变为[hh, tt + 1], 然后在q[tt+1]位置放入入队元素。
是否为空empty:
[hh, tt] 代表元素所在区间,当区间非空的时候,对列非空。也就是tt >= hh的时候,对列非空。
询问队头query:
用 hh 代表队头,q[hh] 就是队头元素,返回 q[hh] 即可。
#include <iostream>
using namespace std;
const int N = 100010;
int q[N];
//[hh, tt] 之间为队列(左闭右闭)
int hh = 0;//队头位置
int tt = -1;//队尾位置
//入队:队尾先往后移动一格,再放入要插入的数据
void push(int x)
{
q[++tt] = x;
}
//出队:队头往后移动一格
void pop()
{
hh++;
}
//[hh, tt]表示队列区间,当tt >= hh时,区间为空
void empty()
{
if(tt >= hh) cout << "NO" << endl;
else cout << "YES" << endl;
}
//hh指向队头,q[hh]代表队头元素
void query ()
{
cout << q[hh] << endl;
}
int main()
{
return 0;
}