栈

逐步演示由节点构成的 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;
}

这个栈可视化工具展示后进先出(LIFO)结构的工作方式:最后入栈的元素最先出栈。栈由C++节点和一个名为 cima_ 的指针构成,该指针指向栈顶节点。你可以生成随机序列,或自己添加入栈和出栈操作,最多共12个。播放时,你会看到节点被创建、与旧栈顶链接、cima_ 移动以及内存被释放,同时对应的代码行会高亮。对空栈执行出栈会有清晰的提示。所有内容都在浏览器中运行,不会发送到任何地方。

使用方法

  1. 选择大小并点击“随机”生成随机的操作序列,或从空列表开始。
  2. 选择入栈或出栈,入栈时输入数值,点击“添加”追加该操作。
  3. 点击“播放”,或用上一步和下一步按钮逐步前进。
  4. 观察 n_ 计数、cima_ 指针,以及标记为刚加入或正在离开的方框。

常见问题

LIFO是什么意思?
后进先出:最近入栈的元素最先出来,所以你始终只操作栈顶。
它有哪些操作?
入栈用于添加值,出栈用于移除栈顶。没有单独的查看栈顶操作。
对空栈执行出栈会怎样?
不会移除任何内容:动画会检查栈是否为空,并提示没有可移除的元素。
会显示代码吗?
会,显示在可调整大小的C++面板中,并为每一步高亮对应的行。

相关工具