两个栈实现一个队列(图解),一看就懂

2023-11-07

两个栈实现一个队列

要想实现此方法,我们现需要了解一下什么是栈和队列。

栈(Stack是一种只能在一端进行插入或删除操作的线性表。) 表中允许进行插入、删除操作的一端称为栈顶(Top)。栈顶的当前位置是动态的,栈顶的当前位置是由一个称为栈顶指针的位置指示器指示。表的另一端称为栈底(Bottom)。当栈中没有数据元素时称为空栈。栈的插入操作称为进栈或入栈(Push),删除操作称为退栈或出栈(Pop)。

栈的主要特点是 “后进先出”,即后进栈的元素先弹出。每次进栈的数据元素都放在原当前栈顶元素之前成为新的栈顶元素,每次出栈的数据元素都是当前栈顶元素。栈也称为后进先出表。

队列

队列简称队(Queue),它也是一种操作受限的线性表,其限制为仅允许在表的一端进行插入,而在表的另一端进行删除。把进行插入的一端称做队尾(rear),进行删除的一端称做队首或队头(front)。向队列中插入新元素称为进队或入队,新元素进入后就成为新的队尾元素;从队列中删除元素称为出队或离队,元素出队后,其直接后继元素就成为队首元素。

由于队列的插入和删除操作分别是在各自的一端进行的,每个元素必然按照进入的次序出队,所以又把队列称为先进先出表

解题思路

1、因为队列是先进先出,栈是后进先出,所以我们可以将两个栈当作两个杯子,添加元素就相当于往里面放正方体。
2、队列的添加元素是从队尾插入,所以每当放入第一个杯子里的正方体,我们将第一个正方体再放入第二个杯子,将第二个物体放到第一个杯子,再把第二个杯子里的第一个正方体放到第一个杯子的第二个物体上,以此类推放置五个,就是我们实现队列的效果了。
3、为了避免队列的顺序错乱,所以我们在做添加或输出是保持另一个栈为空。

图解

在这里插入图片描述
在这里插入图片描述
我们保持栈2为空,通过栈2来将五个元素过度一下,栈2的作用就是相当于一个中介,只是通过栈2来调整顺序以实现队列的效果。

代码实现

#include<stack>
class ToQueue
{
public:
	ToQueue(){}
	~ToQueue(){}
	int back();//返回最后一元素
	bool empty();//判断队列是否为空
	int front();//返回第一个元素
	void pop();//删除第一个元素
	void push(int num);//在末尾添加一个元素
	int size();//返回第一个元素
private:
	stack<int> stack1;//栈1
	stack<int> stack2;//栈2
#include "ToQueue.h"

int ToQueue::back()//返回最后一个元素
{
	while (!stack1.empty())//当栈1不为空
	{
		stack2.push(stack1.top());//把栈1的第一个元素返回到栈2
		stack1.pop();//删除栈1的第一个元素
	}
	int i = stack2.top();//定义临时变量保存栈2的栈顶元素,
	                     //此变量就为队的第一个元素
	while (!stack2.empty())//当栈2不为空
	{
		stack1.push(stack2.top());//将栈2的栈顶元素添加到栈1末尾
		stack2.pop();//移除栈2栈顶元素
	}
	return i;//返回临时变量
}
bool ToQueue::empty()//判断队列是否为空
{
	return stack1.empty();//判断栈1是否为空
}
int ToQueue::front()//返回队列第一个元素
{ 
	return stack1.top();//返回栈1的第一个元素
}
void ToQueue::pop()//删除第一个元素
{
	return stack1.pop();//删除栈1的第一元素
}
void ToQueue::push(int num)//在末尾添加一个元素
{
	while (!stack1.empty())//当栈1不为空时
	{
		stack2.push(stack1.top());//将栈1的第一个元素添加到栈2的栈顶
		stack1.pop();//移除栈1的栈顶元素
	}
	stack1.push(num);//添加元素到栈1的栈顶
	while (!stack2.empty())//当栈2不为空
	{
		stack1.push(stack2.top());//将栈2的第一个元素添加到栈1的栈顶
		stack2.pop();//移除栈2的栈顶元素
	}
}
int ToQueue::size()//返回队列中元素的个数
{
	return stack1.size();//返回栈1的计数器
}
int main()
{
	ToQueue tq;
	tq.push(1);
	tq.push(2);
	tq.push(3);
	tq.push(4);
	tq.push(5);
	tq.push(6);
	cout << "打印队列" << endl;
	while (!tq.empty())
	{
		cout << tq.front()<< endl;
		tq.pop();
	}

}

输出的结果为:在这里插入图片描述
由此可见,我们通过两个栈实现了队列的功能。
如有问题欢迎指出,希望大家多多点评!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个栈实现一个队列(图解),一看就懂 的相关文章

  • 通过 C++ 互操作或其他方式实现 C# 第一类延续?

    我们有一个非常高性能的多任务 近乎实时的 C 应用程序 这一性能主要是通过使用自制的调度程序在内部实施协作多任务来实现的 这通常称为微线程 在这个系统中 所有任务都通过队列与其他任务通信 我们遇到的具体问题似乎只能通过 C 不支持的第一类延
  • 如何在 celery task.apply_async 中使用优先级

    我有一个testcelery 中的队列 我为它定义了一个任务 celery app task queue test ignore result True def priority test priority print priority 它
  • 持久 Akka 邮箱和无损

    在 Akka 中 当一个 actor 在处理消息时死亡 内部onReceive 该消息丢失 有没有办法保证无损 有没有办法配置 Akka 始终保留消息before将他们发送到onReceive 以便在演员死亡时可以恢复并重播 也许像持久邮箱
  • 队列上的 IEnumerable 迭代器是否应该使项目出列

    我创建了一个自定义通用队列 它实现了通用 IQueue 接口 该接口使用 System Collections Generic 命名空间中的通用队列作为私有内部队列 示例已清除不相关的代码 public interface IQueue
  • 需要帮助 Discord 机器人队列

    我一直在尝试为不和谐机器人和我的 gt q命令基本上工作为join play queue同时 问题是它只能同时对 2 首歌曲进行排队 所以我需要帮助使其对多首歌曲进行排队 queues check queue def check queue
  • 使用 Celery 创建动态队列

    这是我的场景 当用户登录我的网站时 我会为给定用户排队一堆任务 通常每个任务需要 100 毫秒 每个用户有 100 多个任务 这些任务排队到默认的 Celery 队列中 并且我有数百个工作线程正在运行 当任务在后端完成时 我使用 webso
  • 使用 sidekiq 处理两个独立的 Redis 实例?

    下午好 我有两个独立但相关的应用程序 他们都应该有自己的后台队列 阅读 单独的 Sidekiq 和 Redis 进程 然而 我希望偶尔能够将工作推给app2的队列来自app1 从简单的队列 推送的角度来看 如果app1没有现有的 Sidek
  • SQL Server 进程队列竞争条件

    我有一个订单队列 多个订单处理器通过存储过程访问该队列 每个处理器都会传递一个唯一的 ID 该 ID 用于锁定接下来的 20 个订单以供自己使用 然后 存储过程将这些记录返回给订单处理器以进行操作 有些情况下多个处理器能够检索相同的 Ord
  • MSMQ如何管理消息?

    看来MSMQ不使用任何数据库管理系统来管理消息 MSMQ如何管理消息 它将消息存储在平面文件中吗 我正在尝试实现一个消息管理系统 MSMQ 使用位于 windir system32 msmq 中的平面文件 如果你想实现自己的队列 我建议你看
  • NodeJS 推送队列,由 Laravel Worker 消耗

    我正在尝试使用节点应用程序发送到 SQS 的消息 因此 推送 操作由服务器 A 上的 Node App 执行 监听 操作由服务器 B 上的 Laravel App 执行 我的问题 我不知道如何格式化要使用的有效负载php artisan q
  • 如何在java中排队并调用实际方法(而不是立即评估)?

    有一个对时间敏感的任务列表 但在这种情况下 时间 对于另一个程序告诉我的内容是任意的 它更像是 滴答声 而不是时间 但是 我不希望立即评估所述方法 我希望一个在另一个完成后执行 我在队列中使用链表 但我不确定如何 是否可以访问类中的实际方法
  • $(this).dequeue();与下一个();

    如果我这样做有什么区别吗 queue queue function next next queue function next next versus queue queue function this dequeue queue func
  • Node Js:Redis 作业在完成其任务后未完成

    希望你们做得很好 我在我的 Nodejs 项目中实现了 BullMQ Bull 的下一个主要版本 来安排发送电子邮件的作业 例如 发送忘记密码请求的电子邮件 所以 我编写了如下所示的代码 用户服务 await resetPasswordJo
  • 删除队列中的最后一个元素

    我需要删除队列的最后一个元素 我唯一可以使用的操作是 Peek 获取第一个元素而不删除它 Enqueue element 向队列末尾插入一个元素 Dequeue 删除第一个元素 IsEmpty true 或 false 队列是否为空 而且我
  • 为什么 std::queue 使用 std::dequeue 作为底层默认容器?

    继续阅读cplusplus com http www cplusplus com reference queue queue std queue实现如下 队列被实现为容器适配器 这些类 使用特定容器类的封装对象作为其 底层容器 提供一组特定
  • C++ 绑定方法队列(任务管理器/调度程序?)

    是否有方法 模式 库可以执行类似的操作 以伪代码形式 task queue push back ObjectType object1 method1 task queue push back OtherObjectType object2
  • 在 PL/SQL 中创建队列订阅者的语法是什么?

    我正在尝试创建一个队列和一个在消息排队时触发的回调 但我无法触发回调 我究竟做错了什么 我有一个将消息入队的触发器 我可以在队列消息表上看到它 我可以手动将其出队并处理它 我只是无法在入队时触发回调 BEGIN DBMS AQADM CRE
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS
  • PHP + MySQL 队列

    我需要一个充当队列的简单表 我的 MySQL 服务器限制是我不能使用 InnoDB 表 只能使用 MyISAM 客户 工人将同时工作 他们每次都需要接受不同的工作 我的想法是执行以下操作 伪代码 job lt SELECT FROM que
  • .NET 中 UniqueQueue 和 UniqueReplacementQueue 集合最有效的实现

    考虑到入队和出队操作的速度同样重要 NET 中 UniqueQueue 和 UniqueReplacementQueue 集合最有效 就速度而言 的实现是什么 UniqueQueue是一个不可能出现重复的队列 因此 如果我将一个元素推送到队

随机推荐

  • Android 控制LED 屏

    翻电脑 发现2013年做的安卓控制LED屏软件 那个时候物联网还没这么火热 APP控制设备也没怎么普遍 刚刚到公司自己给公司做的第一项目就是这个APP 没有美工 界面什么哒都是自己瞎弄的 纪念一下
  • 如何禁止一个软件烦人的更新提示?

    从方法上分析有如下方案 1 打开本软件 首选项 设置不检查更新 2 逆向修改 exe 文件跳过 检查更新 的那个函数 3 操作系统 防火墙 设置禁止这个 程序连接外网 4 修改 hosts文件 把 更新server的 IP 解析为 0 0
  • linux查看文件夹大小命令

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 当磁盘大小超过标准时会有报警提示 这时如果掌握df和du命令是非常明智的选择 d
  • SSM项目的启动流程深入解析

    1 环境说明 本文的内容基于Tomcat9 0 10 Spring 4 3 2 Tomcat加载应用的顺序 在我们正式介绍SSM项目是怎么启动之前 我们要先来简单介绍一下Tomcat 很多人在介绍Tomcat的时候 都把Tomcat叫做Se
  • 字节跳动的产品经理是怎么工作的?

    01 前言 前一篇复盘文章 字节跳动 飞书团队工作1年收获 累计获得了7万 的阅读 明显感觉到大家对字节的一些产品设计和需求管理方法很感兴趣 留言中不少朋友希望了解字节产品需求生命周期全流程相关细节 包括这个过程中PM具体是如何工作的 本文
  • TransUNet论文笔记

    TransUNet论文笔记 TransUNet Transformers Make Strong Encoders for Medical Image Segmentation Abstract 医学图像分割是开发医疗保健系统 尤其是疾病诊
  • element的table大量数据渲染卡顿解决

    B S架构遇到很多的问题应该就是大数据渲染了 毕竟javascript单线程 在使用table的时候 用户想操作大量表格数据 别跟客户说改需求了 不行的 使用vxe table就能解决我们的好多问题 不得不说 这是我遇到过最好的table了
  • for循环练习题-使用嵌套循环,按下面的格式打印字母。

    使用嵌套循环 按下面的格式打印字母 F FE FED FEDC FEDCB FEDCBA include
  • 机器人学习书籍

    1 概率机器人 2 机器人学的几何基础 3 Eigen学习 https blog csdn net u012936940 article details 79691911 eigen 使用手册 平时使用参考 4 opencv opencv
  • element-plus 一个vue3.xUI框架 (element-ui的3.x 版初体验)

    官方文档已更新 点击跳转 突然发现已经半年没更新的element ui更新了 更新了什么还不清楚 但是告知了基于vue3 x版本的 element plus 已经出来了 先来上手体验一下 首先安装一个最新的 vue cli 搭建一个vue3
  • 群晖 使用SMB3进行局域网传输双倍叠加网速下踩的一些坑

    我用的是黑群晖 版本DSM6 2 3 展示成功叠加 原本速度在110左右 网上已经有很多群晖如何双倍叠加的类似的教程 我在这里就不详解了 参考前人写的教程即可 群晖 群晖开启 SMB3 windows下多通道叠加网卡速度 Vedio Tal
  • 某高校毕业设计-数据分析课题技术实现篇

    文章目录 某高校毕业设计 数据分析课题技术实现篇 1 确定分析目标 2 初步判断数据研判数据 2 1能不能找到数据 gt 可以找到 2 2分析指标 2 2 1 指标1 各个老师的毕设通过率 2 2 2 指标2 每年的毕设重修人数 2 2 3
  • java8新特性Stream流中anyMatch和allMatch和noneMatch的使用!!!

    1 anyMatch 判断数据列表中是否存在任意一个元素符合设置的predicate条件 如果是就返回true 否则返回false 接口定义 boolean anyMatch Predicate
  • iOS开发者帐号申请指南

    iOS开发者的申请流程 如果你是一个开发团队 在你打算掏腰包购买iOS开发者授权之前 最好先问一下你的同事 是否已经有人获得了开发许可 因为一个开发许可一年内最多可以授权给111个设备来开发测试 如果你没有授权许可可以借用 或者你打算最终在
  • JavaScript基础之生成随机颜色

    html 用于显示颜色 div style width 200px height 200px div JS function getcolor 获取随机色 ffffff格式 let sljz 0 1 2 3 4 5 6 7 8 9 a b
  • 【Zabbix实战之部署篇】docker部署Zabbix+grafana监控平台

    Zabbix实战之部署篇 docker部署Zabbix grafana监控平台 一 Zabbix介绍 1 Zabbix简介 2 Zabbix的优点 3 Zabbix各组件介绍 4 Zabbix架构图 二 grafana介绍 1 grafan
  • plc梯形图100实例详解_干货

    今天给大家分享的是关于PLC编程控制入门常用到的实例 里面包含的知识点是较为齐全的 如 I O分配表 PLC接线图 梯形图程序等 一 电动机顺序启动 顺序停止控制 I O分配表 PLC接线图 梯形图程序 二 电动机的顺序启动 同时停止 I
  • windows家庭版本使用远程桌面

    windows家庭版是不支持远程桌面的 开源软件RDP Wrapper可以帮助家庭版也支持远程桌面的功能 Github项目地址 安装步骤 1 右键管理员运行install bat 2 右键管理员运行RDPConf exe 问题解决 1 se
  • 实体类监听器EntityListeners

    自定义实体类监听器类 public class DataBaseAuditListener PrePersist public void prePersist Object object throws IllegalArgumentExce
  • 两个栈实现一个队列(图解),一看就懂

    两个栈实现一个队列 要想实现此方法 我们现需要了解一下什么是栈和队列 栈 栈 Stack是一种只能在一端进行插入或删除操作的线性表 表中允许进行插入 删除操作的一端称为栈顶 Top 栈顶的当前位置是动态的 栈顶的当前位置是由一个称为栈顶指针