キュー
ノードで構成された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;
}