循环队列(Circular Queue)是一种基于数组实现的环形结构的队列,用于解决普通队列中“出队后前面空间不能重复使用”的问题。
普通队列的问题:出队后空间无法复用,空间浪费。
循环队列的优点:通过“环形数组”让 rear 和 front 指针循环移动,最大化利用空间。
名称 | 作用 |
---|---|
data[] |
存储数据元素 |
front |
指向队首元素的位置 |
rear |
指向下一个插入位置 |
capacity |
队列容量 + 1(多出一格用于区分满/空) |
// 队列为空
front == rear
// 队列为满(注意必须浪费一个位置)
(rear + 1) % capacity == front
CircularQueue(int k) {
capacity = k + 1; // 多申请一个空间
data = new int[capacity];
front = 0;
rear = 0;
}
bool enQueue(int value) {
if (isFull()) return false;
data[rear] = value;
rear = (rear + 1) % capacity;
return true;
}
bool deQueue() {
if (isEmpty()) return false;
front = (front + 1) % capacity;
return true;
}
int getFront() {
if (isEmpty()) return -1;
return data[front];
}
int getRear() {
if (isEmpty()) return -1;
return data[(rear - 1 + capacity) % capacity];
}
初始状态:
[ , , , , ] front = 0, rear = 0
插入三个元素:
[1, 2, 3, , ] front = 0, rear = 3
出队一个元素:
[1, 2, 3, , ] front = 1, rear = 3
继续插入两元素,形成环:
[5, 2, 3, 4, ] front = 1, rear = 0(rear绕回开头)
你正在开发一个魔法RPG游戏。玩家最多可连续输入5个技能指令(如攻击、闪避、技能1、技能2、普攻),然后由系统按顺序处理这些指令。
技能指令类型:
数字 | 技能名称 |
---|---|
1 | 攻击 |
2 | 闪避 |
3 | 技能1 |
4 | 技能2 |
5 | 普通攻击 |
[输入] 玩家输入:3(技能1)
[输入] 玩家输入:4(技能2)
[输入] 玩家输入:1(攻击)
[输入] 玩家输入:5(普攻)
[输入] 玩家输入:2(闪避)
[输入] 玩家输入:1(攻击) → 覆盖第一个技能
[处理] 执行技能:技能2(出队)
[当前缓冲区] 技能1, 攻击, 普攻, 攻击
class SkillQueue {
int* queue;
int front, rear, capacity;
public:
SkillQueue(int k) {
capacity = k + 1;
queue = new int[capacity];
front = rear = 0;
}
void inputSkill(int skill) {
if ((rear + 1) % capacity == front) {
// 队满,先出队
front = (front + 1) % capacity;
}
queue[rear] = skill;
rear = (rear + 1) % capacity;
}
void processSkill() {
if (front == rear) {
std::cout << "没有技能需要处理\n";
return;
}
int skill = queue[front];
front = (front + 1) % capacity;
std::cout << "处理技能:" << skillToName(skill) << "\n";
}
std::string skillToName(int s) {
std::string skills[] = {"", "攻击", "闪避", "技能1", "技能2", "普攻"};
return skills[s];
}
void printQueue() {
std::cout << "当前技能缓冲区:";
for (int i = front; i != rear; i = (i + 1) % capacity)
std::cout << skillToName(queue[i]) << " ";
std::cout << "\n";
}
};
循环队列不仅是数据结构考试中的高频考点,更是高性能游戏系统中的核心工具。理解它的设计和扩展逻辑,你将更容易处理: