STL中栈、队列和优先队列的使用

本文介绍了STL中的三种容器适配器:栈、队列和优先队列。栈的主要操作包括empty(), pop(), push(), size()和top()。队列的操作类似,包括push(), pop(), front(), back(), empty()和size()。优先队列可以通过自定义优先级,其默认行为是优先级高的元素先出队。" 119183604,9895256,使用DFS解决LeetCode 863:二叉树中距离为K的结点,"['算法', '深度优先搜索', '二叉树', 'LeetCode']

       STL = Standard Template Library,即标准模板库,STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。

      其中,容器分为三类:序列式容器,容器适配器和关联式容器。

      这里要说的栈、队列和优先队列属于容器适配器。

STL中栈的使用

       首先,使用c++ STL中的栈要加入头文件stack,并且使用命名空间std,即       

#include <stack> 
using namespace std;

      栈的定义方式如下:

stack<int>s1;//元素为 int 型
stack<string>s2;// 元素为string型
stack<node>s3;//元素为自定义型

    栈的操作有:

empty()   栈为空时返回真

        pop()       移除栈顶元素,但不会返回栈顶元素的值

        push(x)     在栈顶增加元素x

        size()      返回栈中元素的数目

        top()       返回栈顶元素

STL中队列的使用

    队列的使用方式类似于栈,

    声明:

#include <queue>
using namespace std;

    定义:

queue<int>s1;
queue<string>s2;
queue<node>s3;

   基本操作:

push(x)  将x加入队列的末端

        pop()     弹出队列的第一个元素,也就是对顶元素,但不返回任何值

        front()   返回队列的第一个元素

        back()   返回队列的最后一个元素

        empty() 当队列为空时,返回true

        size()    返回队列的长度

STL中优先队列的使用

   声明:

#include <queue>
using namespace std;

   普通定义:    

  priority_queue<int>q;//通过操作,按照元素从大到小的顺序出队

   通过自定义优先级的方式定义:

struct cmp
{
        operator bool ()(int x, int y)
           {
                 return x > y; // x小的优先级高
           }
};
priority_queue<int, vector<int>, cmp>q;//其中,第二个参数为容器类型。第三个参数为比较函数。

  结构体的声明方式:

struct node
{
    int x, y;
    friend bool operator < (node a, node b)
     {
         return a.x > b.x; //结构体中,x小的优先级高
    }
};
priority_queue<node>q;   //在该结构中,y为值, x为优先级。
     //通过自定义operator<操作符来比较元素中的优先级。
     //在重载”<”时,最好不要重载”>”,可能会发生编译错误


   基本操作:

        empty()   如果队列为空返回真

     pop()      删除队顶元素

     push()    加入一个元素

     size()     返回优先队列中拥有的元素个数

     top()      返回优先队列队顶元素

     PS: 在默认的优先队列中,优先级高的先出队。在默认的int型中先出队的为较大的数。


### C++ STL 中 `stack` `queue` 的使用方法 #### 基本概念 C++ 标准模板库 (STL) 提供了两种重要的容器适配器:`std::stack` `std::queue`。它们分别用于实现(先进后出 LIFO)队列(先进先出 FIFO)。这两种结构都基于其他标准容器(如 `std::vector`, `std::deque`, 或 `std::list`)构建。 --- #### Stack 的基本操作 `std::stack` 是一种后进先出的数据结构,提供了以下常用的操作: - **push**: 向顶添加元素。 - **pop**: 删除顶元素。 - **top**: 返回顶元素的引用。 - **empty**: 判断是否为空。 - **size**: 获取中的元素数量。 下面是一个简单的例子展示如何使用 `std::stack` 并指定底层容器为 `std::vector<int>`[^2]: ```cpp #include <iostream> #include <stack> #include <vector> int main() { std::stack<int, std::vector<int>> s; s.push(1); s.push(2); while (!s.empty()) { std::cout << "Top element is: " << s.top() << '\n'; s.pop(); } } ``` 上述代码展示了如何向中压入两个整数并逐一弹出。 --- #### Queue 的基本操作 `std::queue` 实现了一个先进先出的数据结构,支持以下主要功能: - **push**: 将新元素加入到队列尾部。 - **pop**: 移除队首元素。 - **front**: 访问队首元素。 - **back**: 访问队尾元素。 - **empty**: 检查队列是否为空。 - **size**: 获得当前队列大小。 以下是自定义队列的一个简单示例[^1]: ```cpp template<class T, class Container = std::deque<T>> class CustomQueue { public: void push(const T& value) { _container.push_back(value); } void pop() { _container.pop_front(); } const T& front() const { return _container.front(); } const T& back() const { return _container.back(); } size_t size() const { return _container.size(); } bool empty() const { return _container.empty(); } private: Container _container; }; ``` 此代码片段演示了如何通过模板参数化来自定义队列的底层存储方式。 --- #### 自定义容器适配器 除了默认使用的 `std::deque` 外,还可以显式设置底层容器类型。例如,可以将 `std::vector` 设置为 `std::stack` 的基础容器[^3]: ```cpp #include <iostream> #include <stack> #include <vector> int main() { std::stack<int, std::vector<int>> customStack; customStack.push(10); customStack.push(20); std::cout << "Top of the stack: " << customStack.top() << "\n"; customStack.pop(); if (customStack.empty()) std::cout << "The stack is now empty.\n"; else std::cout << "New top after popping: " << customStack.top() << "\n"; return 0; } ``` 同样地,也可以更改 `std::queue` 的底层容器为 `std::list`: ```cpp #include <queue> #include <list> int main() { std::queue<int, std::list<int>> q; q.push(100); q.push(200); std::cout << "Front element: " << q.front() << ", Back element: " << q.back() << "\n"; q.pop(); if (q.empty()) std::cout << "Queue is empty\n"; else std::cout << "Remaining elements count: " << q.size() << "\n"; return 0; } ``` --- #### 容器适配器的特点对比 | 特性 | `std::stack` | `std::queue` | |--------------|----------------------------------|--------------------------------| | 数据访问模式 | 只能访问顶部元素 | 支持前端 (`front`) 后端 (`back`) | | 默认容器 | `std::deque` | `std::deque` | 需要注意的是,虽然可以通过修改模板参数改变底层容器,但某些容器可能不完全适合特定用途。例如,如果选择 `std::list` 作为 `std::stack` 的底层数组,则会失去随机存取的优势. --- #### §相关问题§ 1. 如何在多线程环境中安全地使用 `std::stack`? 2. 如果希望实现优先级队列而不是普通的队列,应该怎么做? 3. 是否可以在运行时动态切换 `std::stack` 所依赖的基础容器?为什么? 4. 当前有哪些场景更适合使用 `std::deque` 而不是 `std::vector` 来作为 `std::queue` 的底层容器? 5. 怎样利用仿函数定制比较逻辑以扩展 `std::priority_queue` 功能?
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值