Очередь

Пошаговый разбор очереди 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_ на последний добавленный. Можно перемешать случайную последовательность или самому добавить операции enqueue и dequeue, до 12 штук. Анимация охватывает особый случай пустой очереди, связывание последнего узла с новым и момент, когда final_ становится nullptr после опустошения очереди. Каждый шаг подсвечивает свою строку кода, а все вычисления выполняются в вашем браузере. Это отличный способ наглядно понять работу начала и конца очереди.

Как пользоваться

  1. Выберите размер и нажмите Shuffle, чтобы создать случайные операции, или добавьте свои.
  2. Выберите Enqueue или Dequeue, введите значение для enqueue и нажмите Add.
  3. Запустите анимацию или двигайтесь по шагам с помощью элементов управления воспроизведением.
  4. Следите за указателями frente_ и final_, счётчиком n_ и подсвеченной строкой C++.

Часто задаваемые вопросы

Что означает FIFO?
First In, First Out: элементы выходят в том же порядке, в каком пришли, как люди в очереди.
Чем она отличается от стека?
Очередь добавляет элементы в конец и удаляет из начала, а стек делает и то и другое с вершины.
Что происходит при извлечении последнего элемента?
Очередь становится пустой, final_ устанавливается в nullptr, а память узла освобождается.

Похожие инструменты