【C++】stack与queue的使用与模拟实现

【C++】stack与queue的使用与模拟实现
在这里插入图片描述

【C++】stack与queue的使用与模拟实现

前言:在C++ STL中,stack和queue是两个重要的数据结构组件,它们虽然简单却非常实用。与vector、list等容器不同,它们属于容器适配器,通过封装现有容器并提供特定接口来实现栈和队列的功能。接下来,让我们一起学习一下吧!!!
📖专栏【C++成长之旅】

目录


说在前面

对于stack与queue的学习更为简单,但是它们与前面的string、vector……还是有本质区别,string是容器(container ),stack与queue是容器适配器(container adaptor):

是因为它在现有容器的基础上,通过限制功能、改变接口,来“适配”出栈这种特定的数据结构。
也就是说,它的底层,可以是已有的容器,比如:list、vector……
关于容器适配器我会在下篇博客中来详细阐述,敬请期待,现在让我们来学习stack与queue吧。

对于stack和queue的思想,学过数据结构的都知道了,没学过的话也可以看看【栈与队列】

一、stack与queue使用

【stack的参考文档】
【queue的参考文档】
两者的接口都很简单,我们要不展开说明了,来简单应用一下吧。

// stack使用示例#include<stack>#include<iostream>usingnamespace std;intmain(){ stack<int> st; st.push(1); st.push(2); st.push(3);while(!st.empty()){ cout << st.top()<<" ";// 输出: 3 2 1 st.pop();}return0;}

输出:3 2 1
接着就直接来看几个相对应的题吧:
题1:《用栈实现队列》
这个题很简单,但是我们要来体会C++中STL的方便,假设我们用C语言来完成的话,首先要自己实现一个栈才可以解题,但C++不需要。
参考题解:

classMyQueue{private: stack<int> inStack, outStack;voidin2out(){while(!inStack.empty()){ outStack.push(inStack.top()); inStack.pop();}}public:MyQueue(){}voidpush(int x){ inStack.push(x);}intpop(){if(outStack.empty()){in2out();}int x = outStack.top(); outStack.pop();return x;}intpeek(){if(outStack.empty()){in2out();}return outStack.top();}boolempty(){return inStack.empty()&& outStack.empty();}};

有兴趣的自己也可以练练,STL我们要多使用才可以掌握,多练。
题2:《用队列实现栈》,有时间也可以练练

二、stack模拟实现

对于两者的模拟实现也很简单,前面说过,它们两者是容器适配器。
所以对于stack我们可以用vector来封装:

template<classT,classCon= std::vector<T>>classstack{public:stack()//默认构造函数{}voidpush(const T& x)//入栈操作{ _c.push_back(x);//使用底层容器的push_back}voidpop()// 出栈操作{ _c.pop_back();// 使用底层容器的pop_back} T&top(){return _c.back();}const T&top()const{return _c.back();} size_t size()const{return _c.size();}boolempty()const{return _c.empty();}private: Con _c;};

怎么,是不是很简单,不要我们再像vector一样实现一个底层的结构。

三、queue模拟实现

对于queue,我们也可以用vector来封装,因为queue的接口中存在头删和尾插,因此使用vector来封装效率太低(vector在头部删除时需要移动所有后续元素,时间复杂度为O(n),而list的pop_front是O(1)操作。),故可以借助list来模拟实
现queue,具体如下:

template<classT,classCon= std::list<T>>classqueue{public:queue(){}voidpush(const T& x){ _c.push_back(x);}voidpop(){ _c.pop_front();} T&back(){return _c.back();}const T&back()const{return _c.back();} T&front(){return _c.front();}const T&front()const{return _c.front();} size_t size()const{return _c.size();}boolempty()const{return _c.empty();}private: Con _c;};

注意:
对于stack和queue的实现,官方的库中底层则是deque,但是鉴于我们可能不知道deque,下篇博客就会来说deque,但是实现是一样的,如果是deque,我们只需要把容器改为deque即可。


如果本文对您有启发:
点赞 -让更多人看到这篇硬核技术解析 !
收藏 -实战代码随时复现
关注 -获取数据结构系列深度更新
您的每一个[三连]都是我们持续创作的动力!✨
请添加图片描述

Read more

IoTDB Python原生接口全攻略:从基础读写到高级实战

IoTDB Python原生接口全攻略:从基础读写到高级实战

IoTDB Python原生接口全攻略:从基础读写到高级实战 做IoTDB时序数据开发的小伙伴,用Python对接肯定是高频需求,IoTDB官方的Python原生接口封装得特别友好,不管是基础的数据库连接、数据读写,还是高级的连接池管理、SSL加密、Pandas适配,全都能实现。今天就从环境搭建、基础使用,到DDL/DML操作、高级特性,再到测试和DBAPI适配,把IoTDB Python原生接口的用法一次性讲透,新手也能直接上手开发。 一、前期准备:安装依赖与包 用IoTDB Python原生接口前,得先装好两个核心依赖,一步到位不踩坑: 1. 安装thrift框架(要求版本≥0.13),是IoTDB底层的通信依赖 2. 安装IoTDB Python官方包(建议版本≥2.0),提供所有原生操作接口 直接用pip命令安装就行,执行以下两行: pip3 install thrift>=0.13 pip3

By Ne0inhk
【启发式算法】RRT算法详细介绍(Python)

【启发式算法】RRT算法详细介绍(Python)

📢本篇文章是博主人工智能(AI)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉启发式算法专栏:        【启发式算法】(8)---《RRT算法详细介绍(Python)》 【启发式算法】RRT算法详细介绍(Python) 目录  一、RRT算法的核心思想  二、基本流程  三、RRT算法伪代码 [Python] RRT算法实现 [Results] 运行结果 [Notice]  注意事项 四、RRT的特点 五、改进版本:RRT* 六、应用场景         RRT(Rapidly-exploring Random Tree)快速扩展随机树是一种采样式路径规划算法,广泛应用于机器人运动规划、自动驾驶、无人机路径设计等领域。它特别适用于高维空间中的路径规划问题。下面是对RRT算法的详细介绍:  一、

By Ne0inhk
Python 属性描述符:从原理到 ORM 实践详解

Python 属性描述符:从原理到 ORM 实践详解

Python 属性描述符:从原理到 ORM 实践详解 * 一、为什么需要属性描述符?从property的局限性说起 * 二、属性描述符的定义与基础使用 * 2.1 什么是属性描述符? * 2.2 基础实现:整数类型校验描述符 * 2.3 在模型类中使用描述符 * 2.4 关键注意点:避免赋值死循环 * 三、属性描述符的分类:数据描述符与非数据描述符 * 3.1 数据描述符(Data Descriptor) * 3.2 非数据描述符(Non-data Descriptor) * 四、Python完整的属性查找过程:描述符的核心作用 * 4.1 核心查找顺序 * 4.2 关键验证:数据描述符覆盖实例属性 * 4.3 关键验证:

By Ne0inhk

Bug 算法路径规划实战:从数学建模到 Python 实现

1. 从“撞墙”到“绕行”:Bug算法的直觉理解 想象一下,你被蒙上眼睛,站在一个空旷的房间里,有人告诉你:“向前走十步,就能拿到桌子上的苹果。”你开始径直向前走。走了五步,你的膝盖“砰”地一声撞到了什么东西——是一把椅子。这时候你会怎么做?你肯定不会继续硬着头皮往前撞,而是会伸出手,摸着这把椅子的边缘,小心翼翼地绕着它走,直到你感觉前方没有阻碍了,再重新判断苹果的方向,继续前进。 这个“撞到就绕”的朴素策略,就是Bug算法最核心的思想。在机器人路径规划领域,Bug算法就是这样一种简单、直接、不需要“上帝视角”地图的局部规划方法。它不关心整个房间的布局,只关心“我”现在在哪里,“目标”在哪里,以及“我”眼前有没有障碍物。这种特性让它特别适合用在未知环境探索、实时避障以及计算资源有限的场景里,比如你家里的扫地机器人,或者在一个陌生仓库里穿梭的物流小车。 我刚开始接触路径规划时,

By Ne0inhk