📜  堆栈 c++ (1)

📅  最后修改于: 2023-12-03 15:37:49.651000             🧑  作者: Mango

堆栈C++介绍

什么是堆栈?

堆栈(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++中的实现及应用,讲述了其优缺点和与队列的区别。堆栈是一种简单易用的数据结构,适用于实现复杂算法,也可以作为其他数据结构的辅助工具。