キュー

ノードで構成された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++のノードと、2つのポインターで構成されます。frente_ は次に出る要素を、final_ は最後に入れた要素を指します。ランダムな操作列を生成するか、エンキューとデキューを自分で追加できます。再生すると、ポインターやn_カウンターの変化が見え、対応するC++コードの行が強調されます。データ構造を学ぶ際に便利で、処理はブラウザー内で行われます。

使い方

  1. サイズを選んで「シャッフル」を押し、ランダムな操作を生成するか、自分で追加します。
  2. エンキューまたはデキューを選び、エンキューでは値を入力して「追加」を押します。
  3. 再生するか、再生コントロールでステップごとに進めます。
  4. frente_ と final_ のポインター、n_カウンター、強調されるC++の行を追います。

よくある質問

FIFOとは何ですか?
First In, First Out(先入れ先出し)の略で、要素は入った順に出ていきます。順番待ちの行列と同じ考え方です。
スタックとの違いは何ですか?
キューは末尾に入れて先頭から取り出しますが、スタックは出し入れとも先頭で行います。
最後の要素をデキューするとどうなりますか?
キューは空になり、final_ がnullptrに設定され、そのノードのメモリも解放されます。

関連ツール