在 C++ 里,栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的线性数据结构。对栈的操作主要集中在栈顶,数据的添加(入栈,push)和删除(出栈,pop)都在此处进行。下面为你详细剖析 C++ 中的栈:
栈的基本操作
栈的核心操作有以下几种:
- push:把元素添加到栈顶。
- pop:将栈顶元素移除。
- top:获取栈顶元素。
- empty:判断栈是否为空。
- size:返回栈中元素的数量。
C++ 标准库中的栈
C++ 的标准模板库(STL)提供了std::stack
容器适配器,它默认使用deque
作为底层容器,不过也能选择vector
、list
等其他容器。下面是std::stack
的使用示例:
#include <iostream>
#include <stack>
int main() {
std::stack<int> myStack;
// 入栈操作
myStack.push(10);
myStack.push(20);
myStack.push(30);
// 访问栈顶元素
std::cout << "栈顶元素: " << myStack.top() << std::endl; // 输出: 30
// 出栈操作
myStack.pop();
std::cout << "执行一次pop后的栈顶元素: " << myStack.top() << std::endl; // 输出: 20
// 检查栈的大小
std::cout << "栈的大小: " << myStack.size() << std::endl; // 输出: 2
// 判断栈是否为空
std::cout << "栈是否为空: " << (myStack.empty() ? "是" : "否") << std::endl; // 输出: 否
return 0;
}
栈的应用场景
- 函数调用栈:在程序运行时,用于保存函数的局部变量、返回地址等信息。
- 表达式求值:例如,在计算后缀表达式(逆波兰表达式)时会用到栈。
- 括号匹配:可以通过栈来检验表达式中括号是否匹配。
- 回溯算法:像深度优先搜索(DFS)就会使用栈来实现。
- 浏览器的后退功能:借助栈来记录用户访问过的网页。
栈的优缺点
优点:
- 操作简便,入栈和出栈操作的时间复杂度都是 O (1)。
- 数据访问模式清晰,遵循 LIFO 原则。
缺点:
- 灵活性欠佳,只能访问栈顶元素。
- 如果使用静态数组实现,可能会出现栈溢出的情况。