【C++】stack 与 queue

news2024/9/20 21:17:37

stack 与 queue

  • stack
    • STL 容器中 stack 的使用
    • 模拟实现 stack
  • queue
    • STL 容器中 queue 的使用
    • 模拟实现 queue

stack

在数据结构中,我们了解到,stack 栈结构,是一种先进后出的结构,并且我们是使用顺序表来进行实现栈的操作的。

STL 容器中 stack 的使用

C++ STL 中stack的基本操作有:

在这里插入图片描述

代码测试练习:

void test0()
{
	stack<int> s;
	s.push(1);
	s.push(2);
	s.push(3);
	s.push(4);

	cout << "size() = " << s.size() << endl;
	cout << "top = " << s.top() << endl;
	if (s.empty())
		cout << "s is empty!" << endl;
	else
		cout << "s is not empty!" << endl;

	s.pop();
	s.pop();
	s.pop();
	cout << "size() = " << s.size() << endl;
	cout << "top = " << s.top() << endl;
	if (s.empty())
		cout << "s is empty!" << endl;
	else
		cout << "s is not empty!" << endl;

}

在这里插入图片描述

模拟实现 stack

由于栈结构是“后进先出”的,因此在进行栈模拟时候我们可以使用顺序结构来进行,之前学习到 STL 容器中的 vector 容器是顺序结构的,我们可以直接复用:

namespace xx {       //定义自己的命名空间
	template<class T,class Container=std::vector<T>>   //定义模板类型
	class stack {
	public:
		stcak()      //构造方法不需要写,因为 Container 被定义为 vector 容器,会自动进行构造方法的调用 
		{}
		void push(const T& val)
		{
			c.push_back(val);       //使用 vector 容器的尾插方法
		}
		void pop()
		{
			if (empty())
				return ;
			c.pop_back();            //出队,使用 vector 容器中的尾删操作-----------后进先出原则
		}
		T& top()
		{
			return c.back();   //获取栈顶元素,也就是最后一个入栈的元素------即复用 vector 容器中获取最后一个元素的方法
		}
		const T& top()const
		{
			return c.back();
		}
		size_T size()const
		{
			return c.size();         //返回 vector 容器的大小
		}
		bool empty()const
		{
			return c.empty();   //判断 vector 容器是否为空
		}
	private:
		Container c;    //定义 Container 为 vector 容器
	};

}

代码测试:

在这里插入图片描述

queue

在数据结构中,我们知道 queue 队列是一种先进先出的结构。

STL 容器中 queue 的使用

C++ STL 中queue的基本操作有:

在这里插入图片描述

代码测试练习:

void test1()
{
	queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);
	q.push(4);
	q.push(5);
	cout << "size() = " << q.size() << endl;
	cout << "front = " << q.front() << endl;
	cout << "back = " << q.back() << endl;

	q.pop();
	q.pop();
	q.pop();
	cout << "size() = " << q.size() << endl;
	cout << "front = " << q.front() << endl;
	cout << "back = " << q.back() << endl;

	if (q.empty())
		cout << "q is empty!" << endl;
	else
		cout << "q is not empty!" << endl;

	q.pop();
	q.pop();
	if (q.empty())
		cout << "q is empty!" << endl;
	else
		cout << "q is not empty!" << endl;


}

在这里插入图片描述

模拟实现 queue

队列是属于“先进先出”的结构,在队尾进行元素的插入,队头进行元素的删除操作,因此为了避免头删而导致大量元素的移动操作,我们避免使用顺序结构来实现队列,故可以复用 list 链表结构来实现:

namespace xx {          //自定义命名空间
	template<class T,class Container=std::list<T>>        //定义模板类型
	class queue {
	public:
		queue()         //构造方法会直接使用 list 方法的构造
		{}
		void push(const T& val)
		{
			//尾插
			q.push_back(val);        //尾插------链表的尾插操作
		}
		void pop()
		{
			//头删
			if (empty())
				return; 
			q.pop_front();          //队头出队----------链表的头删操作
		}
		T& front()
		{
			return q.front();        //获取队头元素---------链表的首节点信息
		}
		const T& front()const
		{
			return q.front();            
		}
		T& back()
		{
			return q.back();         //获取队尾元素----------链表的尾节点信息
		}
		const T& back()const
		{
			return q.back();
		}
		size_t size()const
		{
			return q.size();       //队中元素个数  -------->  链表中节点个数
		}
		bool empty()const
		{
			return q.empty();        //队列是否为空 -----------> 判断链表是否为空
		}
	private:
		Container q;
	};
}


代码测试:

在这里插入图片描述

ps:

代码需要多练多理解,今天的分享相对于来说还是比较简单的,需要详细的 stack 和 queue 的实现可以参考数据结构中的讲解哦 —> 添加链接描述

~今天的学习就到这里啦!期待周末考试一切顺心鸭!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/384087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用FindFunc在IDA Pro中寻找包含指定代码模式的函数代码

关于FindFunc FindFunc是一款功能强大的IDA Pro插件&#xff0c;可以帮助广大研究人员轻松查找包含了特定程序集、代码字节模式、特定命名、字符串或符合其他各种约束条件的代码函数。简而言之&#xff0c;FindFunc的主要目的就是在二进制文件中寻找已知函数。 使用规则过滤 …

C++回顾(六)—— 对象动态建立

6.1 new 和 delete 用法 6.1.1 概述 在软件开发过程中&#xff0c;常常需要动态地分配和撤销内存空间&#xff0c;例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C提供了较简便而功能较强的运算符new和delete来取代malloc和f…

smart-doc Java Restful API 文档生成工具

smart-doc简介 官方地址smart-doc smart-doc 是一款同时支持 JAVA REST API 和 Apache Dubbo RPC 接口文档生成的工具&#xff0c;smart-doc 在业内率先提出基于 JAVA 泛型定义推导的理念&#xff0c; 完全基于接口源码来分析生成接口文档&#xff0c;不采用任何注解侵入到业…

vue基础学习笔记

1.v-text 设置标签的文本值&#xff0c;将标签内的内容完全替换为v-text绑定的值。 如果想要保留标签内的值&#xff0c;可以采用差值表达式的方式&#xff08;<h2>text{{message}}</h2>&#xff09; 内部值支持拼接 <!DOCTYPE html> <html lang"en…

Unity Asset Bundle学习 - 加载网络资源

昨天调试了一下加载本地资源 Unity Asset Bundle学习 - 加载本地资源 今天试一下用Asset Bundle加载网络数据 接着按照文档走 发现 有问题 引用命名空间一直报错 按文档走不通 就直接百度查了 查了好多 这个东西有很多前辈的经验 直接拷贝代码拿过来用的 下面这段是测试没问题…

技术分享 | OceanBase 集群扩容缩容

作者&#xff1a;杨文 DBA&#xff0c;负责客户项目的需求与维护&#xff0c;会点数据库&#xff0c;不限于MySQL、Redis、Cassandra、GreenPlum、ClickHouse、Elastic、TDSQL等等。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用…

面试官:为什么说ArrayList线程不安全?

本博客知识点收录于&#xff1a;⭐️《JavaSE系列教程》⭐️ 1&#xff09;线程安全与不安全集合 我们学习集合的时候发现集合存在由线程安全集合和线程不安全集合&#xff1b;线程安全效率低&#xff0c;安全性高&#xff1b;反之&#xff0c;线程不安全效率高&#xff0c;安…

Yuga Labs发布“TwelveFold“进军BTC,新大陆的探索即将开启

Yuga Labs 正在将新的 NFT 引入比特币区块链&#xff0c;并于 2 月 28 日推出了一个名为 TwelveFold 的系列。该系列是比特币网络上“刻在 satoshis 上”的 300 个生成作品的限量版。据官方说明&#xff0c;TwelveFold将限量发行三百幅的生成式NFT 画作&#xff0c;每件NFT 作品…

AcWing3696. 构造有向无环图

先看题&#xff1a; 首先来看一下题目的要求&#xff1a;利用给定的边来构造一个有向无环图。 那么什么是有向无环图呢&#xff1f;我们来搜索一番&#xff1a;"所谓有向无环图其实就是&#xff1a;有方向的边&#xff1b;这些边在一个图中不会构成一个闭合的环路。"…

学习大数据应该掌握哪些技能

想要了解大数据开发需要掌握哪些技术&#xff0c;不妨先一起来了解一下大数据开发到底是做什么的~ 1、什么是大数据&#xff1f; 关于大数据的解释&#xff0c;比较官方的定义是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模…

C++STL详解(四)—— vector模拟实现

文章目录vector内置成员变量默认成员函数初始化列表构造迭代器区间构造函数赋个数赋值构造函数赋值构造的相关问题拷贝构造函数赋值运算符重载函数析构函数迭代器及迭代器相关函数begin和end范围for容量与扩容相关函数size和capacityreserveresizeemptyvector中的增删查改&…

「攻略手册」:ShardingSphere 与 Java 应用性能优化

笔者曾经写过一篇文章&#xff0c;介绍 ShardingSphere 在具体代码细节上的优化案例&#xff0c;但文章中没有介绍如何发现代码优化点。本文将结合之前笔者在 ShardingSphere 相关性能问题排查、优化经验&#xff0c;简要地介绍 ShardingSphere 性能问题排查、优化应如何入手。…

解决Sql WorkBench中数据库不能重命名的问题

解决Sql WorkBench中数据库不能重命名的问题mysql不支持直接重命名数据库1. 连接到数据库2. 打开菜单&#xff0c;选择迁移向导3. 点击Start Migration4. 填写源数据库的相应参数5. 填写目标数据库的响应参数6. 稍等片刻&#xff0c;点击Next7. 选择你要迁移的数据库。8. 进入一…

B站依然面临巨大风险,盈利之路可能会更加艰难

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 哔哩哔哩(BILI)虽然得到了阿里巴巴(BABA)和腾讯(00700)的支持&#xff0c;在扩大和多样化用户数量方面也取得了巨大的成绩。但哔哩哔哩还在继续亏损&#xff0c;随着国家的监管环境朝着对游戏行业有利的方向变化&#xff0…

【案例教程】GAMS电力模型

本专题主要针对电力系统领域中比较典型的优化问题、优化方法及其在GAMS中的实现进行分析。共分为五个部分&#xff0c;包括电力系统机组组合专题、最优潮流专题、水电优化运行专题、鲁棒优化和多能源互补优化专题、分布鲁棒优化专题等&#xff0c;从基本模型到复杂模型逐步深入…

MySql数据类型都是字符串(varchar),数据类型一样,但是联表查询不走索引,是什么原因呢

大家都知道,如果联表查询中,数据类型不一样,是很有可能不走索引的,但是有时候数据类型一样也是有可能不走索引的,我们往下看1 数据准备我们准备两个表,用来模拟联表查询1.1 user表CREATE TABLE user (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键,phone varchar(20) DE…

华为OD机试用Python实现 -【几何平均值最大子数组】| 2023年3月被抽中

华为OD机试题 最近更新的博客华为 OD 机试 300 题大纲几何平均值最大子数组题目描述输入描述输出描述说明示例一输入输出说明示例二输入输出说明Python 代码实现核心逻辑最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单</

测试只能干到35岁?35岁+的测试就会失业?

互联网行业在很多年轻人的眼中&#xff0c;是高薪的象征。前几年的软件测试行业还是一个风口&#xff0c;随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业&#xff0c;但是现在裁员潮涌现的时候&#xff0c;互联网行业首当其冲&#xff0c;互联网企业大量的裁员&…

当你开始学习 Python 时,这是一个简单的学习计划及当你初学 Python 时,这里有几个建议

当你开始学习 Python 时&#xff0c;这是一个简单的学习计划&#xff1a; 1.入门 安装Python环境并熟悉基本的Python语法 熟悉Python的基本数据类型&#xff0c;例如数字、字符串和列表 学习控制流程&#xff0c;例如条件语句和循环语句 掌握函数和模块的基本知识 2.进阶 …

Qt开发基本步骤示例:输入半径显示圆的面积

目录 1. 创建一个新项目 1.1 创建类的基类 1.2 main.cpp代码释义 2. 代码写在哪&#xff1f; 2.1 怎么找到我们需要的函数&#xff1f; 1. 创建一个新项目 点击创建项目&#xff0c;开始创建&#xff1a; 1.1 创建类的基类 QMainWindow&#xff1a;带菜单栏的窗口QWidge…