考研复试,stack
在 C++ 中,std::stack
是标准模板库(STL)提供的一个容器适配器,它实现了后进先出(Last-In-First-Out,LIFO)的数据结构,就像一摞盘子,最后放上去的盘子会最先被拿走。下面从定义、基本操作、实现原理、使用示例、应用场景等方面进行详细介绍。
定义与头文件包含
std::stack
定义在 <stack>
头文件中,其定义形式如下:
template< class T, class Container = std::deque<T> > class stack;
T
:表示栈中存储元素的类型。Container
:是一个可选参数,指定用于存储栈元素的底层容器,默认使用std::deque<T>
。也可以使用其他支持back()
、push_back()
、pop_back()
操作的容器,如std::vector
或std::list
。
基本操作
push()
:将一个元素压入栈顶。pop()
:移除栈顶元素,但不返回该元素。top()
:返回栈顶元素的引用,但不移除该元素。empty()
:检查栈是否为空,如果栈为空则返回true
,否则返回false
。size()
:返回栈中元素的数量。
实现原理
std::stack
是一个容器适配器,它本身并不直接存储元素,而是通过封装另一个容器(如 std::deque
、std::vector
或 std::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.size() << std::endl; // 访问栈顶元素 std::cout << "栈顶元素: " << myStack.top() << std::endl; // 弹出栈顶元素 myStack.pop(); std::cout << "弹出栈顶元素后,新的栈顶元素: " << myStack.top() << std::endl; // 检查栈是否为空 if (myStack.empty()) { std::cout << "栈为空" << std::endl; } else { std::cout << "栈不为空" << std::endl; } return 0; }
代码解释
- 创建栈:
std::stack<int> myStack;
创建了一个存储整数的栈。 - 压入元素:使用
push()
方法将元素 10、20、30 依次压入栈顶。 - 获取栈的大小:使用
size()
方法获取栈中元素的数量。 - 访问栈顶元素:使用
top()
方法获取栈顶元素。 - 弹出栈顶元素:使用
pop()
方法移除栈顶元素。 - 检查栈是否为空:使用
empty()
方法检查栈是否为空。
自定义底层容器
可以通过指定第二个模板参数来使用不同的底层容器,例如使用 std::vector
:
#include <iostream> #include <stack> #include <vector> int main() { // 使用 std::vector 作为底层容器创建栈 std::stack<int, std::vector<int>> myStack; myStack.push(1); myStack.push(2); myStack.push(3); std::cout << "栈顶元素: " << myStack.top() << std::endl; return 0; }
应用场景
- 表达式求值:在计算表达式(如后缀表达式)时,可以使用栈来存储操作数和运算符,方便进行计算。
- 函数调用栈:在程序执行过程中,函数调用的上下文信息(如局部变量、返回地址等)会被压入栈中,当函数返回时,这些信息会从栈中弹出。
- 回溯算法:在回溯算法中,栈可以用来记录搜索路径,方便在需要时进行回溯操作。
考研机试常用的数据结构 文章被收录于专栏
考研机试常用的数据结构