📅  最后修改于: 2023-12-03 15:37:49.651000             🧑  作者: Mango
堆栈(Stack), 是一种 后进先出 (Last In First Out, LIFO) 的数据结构。它通常有两个基本操作:入栈(push)和出栈(pop),即把元素放到栈顶或从栈顶取出一个元素。栈还支持查看栈顶元素(top)和判断是否为空(isEmpty)等操作。
在C++中,堆栈的实现可以通过标准库中的 stack
类、双端队列 deque
或动态数组 vector
实现。下面以 stack
类为例。
#include <stack>
// 创建一个空堆栈
std::stack<int> s;
// 创建一个由数组初始化的堆栈
int arr[] = {1, 2, 3, 4};
int n = sizeof(arr) / sizeof(int);
std::stack<int> s(arr, arr + n);
// 入栈
s.push(5);
// 出栈
s.pop();
// 获取栈顶元素
int top_elem = s.top();
// 获取堆栈大小
int size = s.size();
// 判断堆栈是否为空
bool is_empty = s.empty();
堆栈在表达式求值、逆波兰表达式、括号匹配等算法中有广泛的应用。下面以中缀表达式转后缀表达式为例。
#include <stack>
#include <vector>
#include <string>
std::vector<std::string> infix_to_suffix(const std::vector<std::string>& infix)
{
std::vector<std::string> suffix;
std::stack<std::string> ops;
for (const auto& token : infix)
{
if (isdigit(token[0])) // 操作数
{
suffix.push_back(token);
}
else // 操作符
{
while (!ops.empty() && ops.top() != "(" && precedence(token) <= precedence(ops.top()))
{
suffix.push_back(ops.top());
ops.pop();
}
if (token == ")")
{
while (!ops.empty() && ops.top() != "(")
{
suffix.push_back(ops.top());
ops.pop();
}
ops.pop(); // 弹出左括号
}
else
{
ops.push(token);
}
}
}
while (!ops.empty())
{
suffix.push_back(ops.top());
ops.pop();
}
return suffix;
}
堆栈是后进先出的,而队列是先进先出的(First In First Out, FIFO)。
本文介绍了堆栈在C++中的实现及应用,讲述了其优缺点和与队列的区别。堆栈是一种简单易用的数据结构,适用于实现复杂算法,也可以作为其他数据结构的辅助工具。