队列的概念
队列是一种访问受限的线性表,只允许在表的一端进行插入操作,在另一端进行删除操作。允许插入的一端称为队尾,允许删除的一端称为队头。先进入队列的元素会先出队,因此具有先进先出(FIFO)的特性。
数组模拟实现
在算法竞赛或底层开发中,为了追求极致效率,常使用数组配合指针来模拟队列。这种方式避免了动态内存分配的开销。
基础结构定义
我们需要一个足够大的数组充当队列空间,并用两个变量分别标记队头和队尾的位置。这里采用一种常见的左开右闭区间 (h, t] 的设计:
h标记队头元素的前一个位置;t标记队尾元素的位置。
这种设定主要是为了代码书写方便,只要逻辑闭环、不出现边界 bug,具体怎么定义都可以。
const int N = 1e6 + 10;
int h, t; // 队头指针,队尾指针
int q[N]; // 队列数据区
核心操作
入队
从下标为 1 的位置开始存储有效元素。将新元素放入队尾指针的下一个位置,然后移动队尾指针。
// 入队
void push(int x) {
q[++t] = x;
}
时间复杂度为 O(1)。
出队
直接移动队头指针即可,不需要真正删除数组中的数据,因为后续操作不会再次访问这些'过期'数据。
// 出队
void pop() {
h++;
}
时间复杂度同样为 O(1)。
获取队头/队尾
注意区分指针指向和实际元素位置。队头元素实际上是 h 所指位置的下一个元素。
// 队头元素
int front() {
return q[h + 1];
}
// 队尾元素
int back() {
return q[t];
}


