循环队列与技能释放缓存器

发布于:2025-05-01 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、什么是循环队列?

循环队列(Circular Queue)是一种基于数组实现的环形结构的队列,用于解决普通队列中“出队后前面空间不能重复使用”的问题。

🔹 普通队列的问题:出队后空间无法复用,空间浪费。

🔹 循环队列的优点:通过“环形数组”让 rear 和 front 指针循环移动,最大化利用空间。


二、循环队列结构原理

1. 关键变量

名称 作用
data[] 存储数据元素
front 指向队首元素的位置
rear 指向下一个插入位置
capacity 队列容量 + 1(多出一格用于区分满/空)

2. 判断状态

// 队列为空
front == rear

// 队列为满(注意必须浪费一个位置)
(rear + 1) % capacity == front

三、循环队列的核心操作

1. 初始化队列

CircularQueue(int k) {
    capacity = k + 1;         // 多申请一个空间
    data = new int[capacity];
    front = 0;
    rear = 0;
}

2. 入队(Enqueue)

bool enQueue(int value) {
    if (isFull()) return false;
    data[rear] = value;
    rear = (rear + 1) % capacity;
    return true;
}

3. 出队(Dequeue)

bool deQueue() {
    if (isEmpty()) return false;
    front = (front + 1) % capacity;
    return true;
}

4. 获取队首与队尾

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 普通攻击

🎯 目标:

  1. 使用循环队列实现技能输入缓存;
  2. 输入满了后,新的输入覆盖最早的技能;
  3. 每帧模拟处理一个技能(出队)并显示;
  4. 显示当前技能缓冲区状态。

💡 示例流程:

[输入] 玩家输入: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";
    }
};

六、总结

循环队列不仅是数据结构考试中的高频考点,更是高性能游戏系统中的核心工具。理解它的设计和扩展逻辑,你将更容易处理:

  • 实时操作输入;
  • 资源加载控制;
  • 时间敏感的队列系统(比如 AI 决策、动作序列等)。

网站公告

今日签到

点亮在社区的每一天
去签到