栈
逐步演示由节点构成的 C++ 栈。
所有内容均在此浏览器中模拟,不会发送到任何服务器。
值
创建新节点
创建新节点
n_ = 0
栈为空
- 刚加入
- 正在离开
第 1 / 47 步
代码
#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 Pila {
private: // 最后入栈的节点是栈顶
Nodo* cima_; // 栈顶节点
int n_; // 节点数量
public:
Pila() : cima_(nullptr), n_(0) {}
// Destructor (no se anima)
~Pila() {
while (cima_ != nullptr) desapilar();
}
void apilar(int valor) { // 压入栈顶:O(1)
Nodo* nuevo = new Nodo(valor); // 创建节点
nuevo->setSiguiente(cima_); // 新节点指向原来的栈顶
cima_ = nuevo; // cima_ 现在指向新节点
n_++;
}
void desapilar() { // 弹出栈顶:O(1)
if (cima_ == nullptr) return; // 栈为空:没有可移除的元素
Nodo* temp = cima_; // 保留栈顶节点以便释放
cima_ = cima_->getSiguiente(); // cima_ 下移到下一个节点
delete temp; // 释放内存
n_--;
}
// Muestra la pila de la cima a la base
void imprimir() const {
cout << "cima ->";
for (Nodo* p = cima_; p != nullptr; p = p->getSiguiente())
cout << " " << p->getDato();
cout << endl;
}
};
int main() {
Pila pila;
pila.apilar(3);
pila.apilar(6);
pila.apilar(9);
pila.imprimir(); // cima -> 9 6 3
pila.desapilar();
pila.imprimir(); // cima -> 6 3
pila.apilar(1);
pila.imprimir(); // cima -> 1 6 3
return 0;
}