std::stack

std::stack 是 C++ 标准库中的一种容器适配器,它提供了栈(LIFO,后进先出)数据结构的实现。std::stack 本质上是一个容器适配器,它可以基于其他容器(如 std::dequestd::vectorstd::list)来实现栈的功能。

1. 底层实现

std::stack 并不是一个独立的数据结构,而是对其他序列容器(默认情况下为 std::deque)进行封装,提供了栈的接口。你可以选择使用不同的底层容器来实现 std::stack,但是它的操作受限于栈的性质,即只允许在一端进行插入和删除操作。

默认实现
  • 默认容器std::dequestd::stack 的默认底层容器。std::deque(双端队列)允许在两端进行高效的插入和删除操作,这与栈的需求非常匹配。
自定义实现
  • 你可以使用 std::vectorstd::list 作为底层容器,只需要在定义 std::stack 时指定:
    std::stack<int, std::vector<int>> stackWithVector;

2. 常用成员函数

std::stack 提供了几种常用的操作函数,这些函数都是栈操作的经典实现:

构造函数
  • stack():创建一个空栈。
  • stack(const Container& cont):使用指定的容器 cont 初始化栈。
元素访问
  • top():返回栈顶元素的引用。这个操作不会移除元素,仅仅返回栈顶元素。
容量
  • empty():检查栈是否为空。如果栈为空,返回 true;否则返回 false
  • size():返回栈中元素的个数。
修改
  • push(const T& value):将元素 value 压入栈顶。
  • pop():移除栈顶元素,但不会返回该元素。
  • emplace(Args&&... args):在栈顶位置直接构造元素。它比 push 更高效,因为可以避免临时对象的创建。

3. 具体操作示例

以下是一个使用 std::stack 的简单示例:

#include <iostream>
#include <stack>
#include <vector>

int main() {
    // 使用默认的 deque 作为底层容器
    std::stack<int> stack;

    // 将元素压入栈顶
    stack.push(10);
    stack.push(20);
    stack.push(30);

    std::cout << "Stack size: " << stack.size() << std::endl;
    std::cout << "Top element: " << stack.top() << std::endl;

    // 弹出栈顶元素
    stack.pop();
    std::cout << "Top element after pop: " << stack.top() << std::endl;

    // 判断栈是否为空
    while (!stack.empty()) {
        std::cout << "Popping element: " << stack.top() << std::endl;
        stack.pop();
    }

    // 使用 vector 作为底层容器
    std::stack<int, std::vector<int>> stackWithVector;
    stackWithVector.push(40);
    stackWithVector.push(50);
    std::cout << "Top element in stackWithVector: " << stackWithVector.top() << std::endl;

    return 0;
}

4. 总结

  • 底层实现std::stack 是一个容器适配器,默认使用 std::deque 作为底层容器。你可以根据需要选择不同的底层容器,如 std::vectorstd::list
  • 主要操作std::stack 提供了 pushpoptopemptysize 等操作,用于管理栈顶元素和检查栈的状态。
  • 适用场景std::stack 适用于需要 LIFO 行为的数据结构,如表达式求值、递归模拟等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值