【C++初阶】queue的常见操作和模拟实现

44 篇文章 5 订阅
订阅专栏

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏: C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


目录

  • 一、queue的基本概念
  • 二、 queue的常见操作
  • 三、有关队列的力扣经典题
      • 3.1 二叉树的层序遍历
      • 3.2 用队列实现栈
  • 四、模拟实现queue
      • 4.1 简介
      • 4.2 代码实现

一、queue的基本概念

  • queue是一种容器适配器:现有的容器转化出来的(本质就是复用),也就是说queue是依靠其他容器来实现的。
  • 队列queue是一种先进先出(First in First Out,简称FIFO)的数据结构, 其中从容器一端插入元素,另一端提取元素
  • 容器适配器通常会限制对底层容器的访问方式,因此不支持随机访问。

在这里插入图片描述

二、 queue的常见操作

在这里插入图片描述

三、有关队列的力扣经典题

3.1 二叉树的层序遍历

链接:点击跳转

【题目描述】

在这里插入图片描述

【思路】

在这里插入图片描述

【代码实现】

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) 
    {
        queue<TreeNode*>q;
        vector<vector<int>> vv;
        int levelSize;

        // 如果根节点不为空,则入队列
        if (root)
        {
            q.push(root);
            // 并且根节点的root一定为1
            levelSize = 1;
        }

        while (!q.empty())
        {
            // 一层一层出
            vector<int> v;
            for (int i = 0;i < levelSize;i++)
            {
                // 记录当前节点
                TreeNode* front = q.front();
                // 删除节点并存入
                q.pop();
                v.push_back(front->val);
                // 并带入它的子节点
                if (front->left) q.push(front->left);
                if (front->right) q.push(front->right);
            }
            vv.push_back(v);
            // 一层出完更新一层的个数
            levelSize = q.size();
        }
        return vv;
    }
};

3.2 用队列实现栈

链接:点击跳转

【题目描述】

在这里插入图片描述

【思路】

队列的特点是先进先出,而栈是先进后出,首先定义两个队列

在这里插入图片描述

那如何模拟一个栈呢?首先往空的队列入数据

在这里插入图片描述

对于栈来说,先出的是4。因此我们可以把1 2 3移到另一个空队列中

在这里插入图片描述

【代码实现】

class MyStack {
public:
    MyStack() {}
    
    void push(int x) 
    {
    	// 往不是空的队列插入数据
        if (in.empty())
        {
            out.push(x);
        }
        else
            in.push(x);
    }
    
    int pop() 
    {
    	// 保持一个队列为空
    	// 将一个为空的队列的前n-1个移到空队列
    	// 剩下的那个这是栈顶元素
        if (in.empty())
        {
            while (out.size() > 1)
            {
                int front = out.front();
                out.pop();
                in.push(front);
            }
            int ans = out.front();
            out.pop();
            return ans;
        }
        else // out为空
        {
            while (in.size() > 1)
            {
                int front = in.front();
                in.pop();
                out.push(front);
            }
            int ans = in.front();
            in.pop();
            return ans;
        }
    }
    
    int top() 
    {
        if (in.empty())
        {
           return out.back();
        }
        else 
        {
            return in.back();
        }
    }
    
    bool empty()
    {
        return in.empty() && out.empty();
    }
private:
    queue<int> in;
    queue<int> out;
};

四、模拟实现queue

4.1 简介

在这里插入图片描述

queue同样也是一种容器适配器对于容器适配器,大家可以理解为对已有的东西(容器)进行适配转换。因此就增加了模板参数Container。在数据结构中,队列我们是使用链表来实现的,而为啥模板参数的缺省值deque容器,而不是list容器,后面会讲解到

4.2 代码实现

队列需要满足先进先出,因此常见的操作有尾插、头删…

#pragma once

namespace wj
{
	template<class T, class Container = deque<T>>
	class queue
	{
	public:
		// 本质是尾插
		void push(const T& x)        
		{
			_con.push_back(x);       
		}
		
		// 头删
		void pop()                   
		{
			_con.pop_front();    
		}
		
		// 访问头部元素
		const T& front()            
		{
			return _con.front();
		}
		
		// 访问尾部元素
		const T& back()              
		{
			return _con.back();
		}

		size_t size()                
		{
			return _con.size();      
		}

		bool empty()                 
		{
			return _con.empty();     
		}

	private:
		Container _con;
	};

注意:队列就不能用vector适配了,因为vector没有提供pop_front接口,但是也可以强制适配。只需要改动pop接口

void pop()                   
{
	_con.erase(_con.begin());      
}

但注意,库里是没有强制适配的

在这里插入图片描述

为了贴近库,最好不要进行强制适配

那么为什么库里不适配vector?原因是:队列需要进行大量头删操作,而vector底层头删需要移动大量数据,效率极低。

【C++ 】优先级队列(Priority_Queue)底层框架模拟实现
HenryBlog
12-08 984
priority_queue code
C++模拟实现priority-queue
03-18
C++模拟实现优先级队列,涉及到仿函数的使用,堆的向上调整法和向下调整法
C++-queue的使用与模拟实现
sushang的博客
12-17 894
1.队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。2.队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。3.底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:empty:检测队列是否为空size:返回队列中有效元素的个数front:返回队头元素的引用back:返回队尾元素的引用。
【C++】stack的常见操作以及模拟实现
Weraphael的博客
08-28 184
stack的常见操作及模拟实现
C++ priority_queue(优先级队列)的使用和模拟实现
小萌新的博客
12-14 625
主要介绍了优先级队列的使用和模拟实现
【C++】stack、queue和priority_queue的模拟实现
m0_67077469的博客
12-26 339
stack、queue和priority_queue的模拟实现
C++:stack&queue
yourfriendyo的博客
04-04 1202
Stack&Queue 1. 栈和队列的介绍 1.1 stack 的介绍 栈是一种特殊的线性表,栈只允许在其固定的一端进行插入和删除元素的操作。进行数据插入删除操作的一端被称为栈顶,另一端被称为栈底。栈中的数据元素遵循后进先出的原则。 压栈:栈的插入操作被称为压栈,也可以叫做进栈、入栈。出栈:栈的插入操作被称为出栈,或称弹栈。 后进先出,先进后出,即 LIFOLIFOLIFO 原则(Last In First Out)。 1.2 queue 的介绍 队列同样是一种特殊的线性表,和栈相反,队列只允许
C++ stack和queue的模拟实现
小萌新的博客
12-14 438
本文主要介绍了Stack和queue的模拟实现以及deque的简单介绍
【C++】priority_queue原理使用 && 模拟实现
2301_78611726的博客
04-18 486
1.是一种,根据严格的弱排序标准,它的。2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。4.,也可以是其他特定设计的容器类。容器应该,并支持以下操作:5. 标准容器类vector和deque满足这些需求。
c++中stack、queue和vector的基本操作示例
08-29
主要给大家介绍了关于c++中stack、queue和vector基本操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
C++实现STL容器之queue
04-08
C++实现STL容器之queue
C++ stack 和 queue 的笔记
02-22
C++ stack 和 queue 的笔记
C++:round函数用法
Solititude的博客
05-28 346
C++:round函数用法
CrossOver支持M4新品吗?苹果M4芯片对游戏支持的怎么样?
软妹子的博客
06-01 441
CrossOver是一款可以在不同平台之间无缝切换的软件,它可以让你在MacOS或者Linux操作系统上运行Windows应用程序,无需安装双系统或虚拟机。CrossOver是基于Wine项目开发的,Wine是一个可以在非Windows平台上运行Windows应用程序的兼容层。那么,CrossOver是否支持M4新品呢?M4芯片又对游戏支持的怎么样呢?本文将从以下几个方面来探讨这个问题。M4芯片正式亮相,首发产品是2024款的iPadPro。
C++/Python/Java AWS S3认证
一个大佬的博客
06-01 711
【代码】C++/Python/Java AWS S3认证。
【C++】list的使用(下)
2303_79329831的博客
06-01 585
本篇博客主要内容:STL库中list用法的讲解。让我们接着上一篇博文的内容继续,进入list最后一个模块,操作list对象的接口函数。本篇文章所讲到的list内容出自于同一个模块,由于其排序和合并的方式涉及到了仿函数的传递,所以内容和篇幅稍微会大一些。相信学完本篇内容之后,能对list的使用和C++有更充分的了解。♥STLC++
c++ string模拟实现
最新发布
2302_81705247的博客
06-01 528
模拟实现string类,里面包含四个成员变量,第一个是指向字符数组的指针,第二个变量是目前存放了多少个字符,第三个变量为这个字符数组的容量的大小。最后一个为静态成员变量npos。注意:一个修饰的成员变量可以在类里面始化(三者缺一不可),而其他成员变量,要声明定义分离,类中声明,类外定义。char* _str;
精通C++ STL(二):string类的模拟实现
Russ_Leo的博客
05-27 824
string类各函数接口。
queue操作c++
12-05
以下是C++中queue的常用操作: 1. 声明queue:可以使用STL库中的queue头文件,声明一个queue对象,例如: ```c++ #include <queue> using namespace std; queue<int> q; // 声明一个int类型的队列 ``` 2. 入队操作:...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 程序员都是这样关机的 47456
  • C语言经典编程题 --- 打印菱形 14020
  • 递归经典例题 --- 汉诺塔(图文详解) 7324
  • qsort函数用法 + 模拟实现qsort函数 6621
  • 【C语言】getchar和putchar 6433

分类专栏

  • Linux 22篇
  • mysql数据库 9篇
  • 课设 5篇
  • C语言航路 21篇
  • 工具环境安装教程 2篇
  • C++ 44篇
  • 【C/C++】算法 10篇
  • C语言刷题 7篇
  • 数据结构 16篇
  • 面试/笔试题 6篇
  • LeetCode 5篇

最新评论

  • 【LInux】<基础IO> 文件操作 | 文件描述符 | 重定向

    普通网友: 优质好文,支持支持。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • 【Linux】环境变量

    CSDN-Ada助手: 推荐 CS入门 技能树:https://edu.csdn.net/skill/gml?utm_source=AI_act_gml

  • C语言经典编程题 --- 打印菱形

    没有难学的知识~: 下取整

  • C语言经典编程题 --- 打印菱形

    2401_84412711: 注释是不是有问题? 那个down=n/2的注释应该是下部分的行数吧?

  • 【MySQL】聚合函数和分组聚合

    普通网友: 写的真好!我也写了一篇获取【大厂面试真题解析、核心开发学习笔记、最新全套讲解视频、实战项目源码讲义、学习路线简历模板】的文章

大家在看

  • 1211. 查询结果的质量和占比
  • 如何用python做一个用户登录界面——浔川python社
  • 卷积神经网络基础1 1031
  • C++基础
  • 消息队列之王——Kafka 1203

最新文章

  • 【Linux】文件系统和软硬链接
  • 【Linux】简单模拟C语言文件标准库FILE
  • 【Linux】用户级缓冲区
2024年36篇
2023年94篇
2022年11篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

聚圣源稀罕的近义词姓张的起名女孩两个字钢琴调音昵图网给医药器械公司起名周易起名软件是真的吗菜根谭的智慧长生殿10086中国移动营业厅备中的伊达独眼龙美缝起名女性向av关爱他人的作文童姓起名字啊汪字起名字鼠年男生宝宝起名www.cmfu.com店铺起名软件免费下载感动的作文搞笑图片大全笑死人用可可起个好听的网名扫黑风暴主演员表煎饼店起什么名字好公司起名规矩五格起名法吉凶表属龙的起名字禁忌义乌家居饰品批发网上选车牌号九月的宝宝起名字网站广告招商淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化