循环队列模板
数组模拟队列,取模实现循环——避免频繁移动元素
循环队列
数组模拟
取模
GESP6
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
struct CircQueue {
int data[N];
int front, rear;
CircQueue() : front(0), rear(0) {}
bool empty() { return front == rear; }
bool full() { return (rear + 1) % N == front; }
void push(int x) {
if (full()) return; // 队满
data[rear] = x;
rear = (rear + 1) % N;
}
void pop() {
if (!empty()) front = (front + 1) % N;
}
int top() { return data[front]; }
int size(){ return (rear - front + N) % N; }
};
int main() {
CircQueue q;
for (int i = 1; i <= 5; i++) q.push(i);
while (!q.empty()) {
cout << q.top() << " ";
q.pop();
}
// 输出: 1 2 3 4 5
return 0;
}
📖 要点说明
(rear+1)%N == front判满(牺牲一个空间)- 取模实现循环:
(idx + 1) % N - size 计算:
(rear - front + N) % N
⚠️ 常见错误
- 判满条件写错导致死循环
- 取模忘加 N(rear < front 时 size 为负)
- push 不判满导致覆盖数据