C/C++数据结构之栈基础
概述
在食堂或自助餐厅中,清洁的餐盘通常会按照从下到上的顺序堆叠在一起。服务员或者顾客需要使用时,总是从最上面取一个盘子来用,而不是从最下面取一个盘子。为什么呢?因为这些盘子是“后放上去的先拿出来”。这其实就是我们今天要介绍的数据结构 —— 栈(Stack)。
原理
我们可以把栈想象成这样一个箱子:它只有一个口,叫做栈顶,所有东西都必须从这个口进去或出来。放东西进去,叫压栈(Push)。拿东西出来,叫弹栈(Pop)。
在下面的表格中,我们在不同时间对箱子做了不同的动作。可以看到,越晚放进箱子里的东西,越早被拿出来。
时间 | 动作 | 箱子里的内容 |
---|---|---|
第1秒 | Push A | [A] |
第2秒 | Push B | [A, B] |
第3秒 | Push C | [A, B, C] |
第4秒 | Pop | [A, B] → 弹出的是C |
第5秒 | Pop | [A] → 弹出的是B |
栈的核心思想是:后进先出(LIFO:Last In First Out)。也就是说:最后放进来的元素,最先被取出;最先放进来的元素,最后才能被取出。
STL中的栈
在C++ STL标准模板库中,已经提供了栈这种数据结构,即std::stack。如何使用std::stack,可以参考下面的示例代码。
#include <iostream>
#include <stack>using namespace std;int main()
{stack<int> s;// 压入66s.push(66);// 压入77s.push(77);// 压入88s.push(88);while (!s.empty()){ // 打印栈顶元素cout << s.top() << " ";// 弹出栈顶元素s.pop();}return 0;
}
总结
栈是一种非常重要的线性数据结构,遵循后进先出的原则。栈中元素只能从栈顶进行插入或删除操作,栈底固定不动。栈的典型应用场景包括:函数调用栈、表达式求值与转换、括号匹配检查等。在C/C++中,栈可以通过数组或链表来实现,我们会在后续的文章中专门进行介绍。