队列

逐步演示由节点构成的 C++ 队列。

所有内容均在此浏览器中模拟,不会发送到任何服务器。

值

创建新节点

创建新节点

n_ = 0

队列为空

  • 刚加入
  • 正在离开

第 1 / 54 步

代码

#include <iostream>
using namespace std;
class Nodo { // 节点保存数据和指向下一个节点的指针
private: // 私有属性:只有方法可以访问
int dato;
Nodo* siguiente;
public:
Nodo(int d) : dato(d), siguiente(nullptr) {}
int getDato() const { return dato; }
Nodo* getSiguiente() const { return siguiente; }
void setDato(int d) { dato = d; }
void setSiguiente(Nodo* s) { siguiente = s; }
};
class Cola {
private: // frente_ 是下一个出队的,final_ 是最后到达的
Nodo* frente_; // 队列的第一个节点
Nodo* final_; // 队列的最后一个节点
int n_; // 节点数量
public:
Cola() : frente_(nullptr), final_(nullptr), n_(0) {}
// Destructor (no se anima)
~Cola() {
while (frente_ != nullptr) desencolar();
}
void encolar(int valor) { // 从队尾入队:O(1)
Nodo* nuevo = new Nodo(valor); // 创建节点
if (final_ == nullptr) { // 队列为空?
frente_ = final_ = nuevo; // 它是唯一的节点:frente_ 和 final_ 都指向它
} else {
final_->setSiguiente(nuevo); // 最后一个节点指向新节点
final_ = nuevo; // final_ 现在指向新节点
}
n_++;
}
void desencolar() { // 从队首出队:O(1)
if (frente_ == nullptr) return; // 队列为空:没有可移除的元素
Nodo* temp = frente_; // 保留队首节点以便释放
frente_ = frente_->getSiguiente(); // frente_ 移到下一个节点
if (frente_ == nullptr) final_ = nullptr; // 队列已空:final_ 不再指向任何节点
delete temp; // 释放内存
n_--;
}
// Muestra la cola del frente al final
void imprimir() const {
cout << "frente ->";
for (Nodo* p = frente_; p != nullptr; p = p->getSiguiente())
cout << " " << p->getDato();
cout << endl;
}
};
int main() {
Cola cola;
cola.encolar(3);
cola.encolar(6);
cola.encolar(9);
cola.imprimir(); // frente -> 3 6 9
cola.desencolar();
cola.imprimir(); // frente -> 6 9
cola.encolar(1);
cola.imprimir(); // frente -> 6 9 1
return 0;
}

这个队列可视化工具讲解先进先出(FIFO)结构:最先进入的元素最先离开。队列由C++节点和两个指针构成:frente_ 指向下一个要离开的元素,final_ 指向最后插入的元素。你可以随机生成序列,也可以自己添加入队和出队操作,最多12个。动画涵盖了空队列的特殊情况、最后一个节点如何与新节点链接,以及队列清空后 final_ 何时变为 nullptr。每一步都会高亮其代码行,所有计算都在你的浏览器中完成。

使用方法

  1. 选择大小并点击“随机”生成随机操作,或自行添加。
  2. 选择入队或出队,入队时输入数值并点击“添加”。
  3. 播放动画,或用播放控件逐步前进。
  4. 跟随 frente_ 和 final_ 指针、n_ 计数以及高亮的C++代码行。

常见问题

FIFO是什么意思?
先进先出:元素按到达的顺序离开,就像排队等候的人一样。
它和栈有什么不同?
队列在队尾插入、在队首移除,而栈的插入和移除都发生在栈顶。
出队最后一个元素时会怎样?
队列变为空,final_ 被设为 nullptr,节点的内存也会被释放。

相关工具