📚 模拟栈操作 - 算法可视化教学

📋 题目描述

实现一个简单的栈(后进先出)数据结构,支持以下三种操作:
  • push x:将整数 x 压入栈顶
  • pop:弹出栈顶元素,并输出该元素
  • top:查看栈顶元素,并输出该元素
初始时栈为空。给定 n 条操作指令,按顺序执行并输出所有 pop 和 top 的结果。

📥 输入格式

第一行一个整数 n,表示操作数量
接下来 n 行,每行一个操作:push x、pop 或 top

📤 输出格式

对于每个 pop 或 top 操作,输出一行,表示栈顶元素的值

💡 核心思想

栈 (Stack) 是一种后进先出 (LIFO) 的数据结构。
  • 最后压入的元素最先弹出
  • 用数组模拟时,top 变量记录栈顶位置
  • push 时 top++,pop 时 top--

📊 样例输入 1

7 push 5 push 3 top pop push 8 top pop

📊 样例输出 1

3 3 8 8

📌 注意事项

• 题目保证 pop 和 top 时栈不为空
• push 的整数 x 范围:-1000 ≤ x ≤ 1000
• 数组下标从 1 开始时更直观(避免 0 的特殊处理)
• top 表示栈中元素个数,也是栈顶元素的下标
步骤
0
栈大小
0
当前操作
-
输出值
-
点击「自动播放」或「单步」开始演示
⬆ 栈顶
⬇ 栈底

💡 当前步骤

点击「自动播放」或「单步」开始演示

📈 执行记录

步骤 操作 栈大小 输出

⏱ 时间复杂度

O(n)
每个操作只需一次数组访问

💾 空间复杂度

O(n)
使用数组存储栈元素

⚠️ 常见错误

• top 变量初始值错误(应该是 0)
• push 时忘记先 top++ 再赋值
• pop 时忘记先输出再 top--
• 数组越界(需要开足够大的数组)

💻 C++ 参考代码

#include <bits/stdc++.h> #define endl '\n' using namespace std; int n; int arr[110]; string str; int main(){ cin >> n; int top = 0; // top表示当前栈中有的元素个数 for(int i = 1; i <= n; i++){ cin >> str; if(str == "push"){ top++; cin >> arr[top]; } else if(str == "pop"){ cout << arr[top] << endl; top--; } else if(str == "top"){ cout << arr[top] << endl; } } return 0; }