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

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(使用前将#替换为@)

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

  • 最大流-Dinic算法,原理详解,四大优化,详细代码

    文章目录 零 前言 一 概念回顾 可略过 1 1流网络 1 2流 1 3最大流 1 4残留网络 1 5增广路
  • 检查 JavaScript setTimeout 是否已触发

    我希望能够通过 JavaScript 分派大量工作在浏览器中完成 从而使浏览器始终保持响应能力 我尝试采取的方法是将工作分块 将每个块传递给一个函数 然后用一个函数排队setTimeout func 0 call 我需要知道所有工作何时完成
  • 无法设置 POSIX 消息队列属性

    我的环境 CentOS 6 5 64位内核 海湾合作委员会 4 4 7 20120313 我正在尝试设置 POSIX 消息队列的属性 但代码不会更改该属性 我只获得默认属性值 你能指出我的代码有什么问题吗 我以用户 而不是 root 身份执
  • Spring 的 ThreadPoolTask​​Executor 的默认队列大小是多少?

    我正在使用 Spring 4 3 8 RELEASE 和 Java 7 我想创建一个线程池来执行任务 所以我在 Spring contxet 中设置了以下内容
  • Swift:为蓝牙中央管理器选择队列

    我正在开发一个应用程序 该应用程序将通过 BLE 与智能设备连接并与其通信 问题是 在哪个队列中处理蓝牙事件的最佳实践是 我读过很多教程 在所有教程中我发现了这一点 centralManager CBCentralManager deleg
  • Python 中内置最大堆 API

    默认 heapq 是最小队列实现 想知道是否有最大队列的选项 谢谢 我尝试使用 heapify max 作为最大堆的解决方案 但如何动态处理推送 弹出元素 看来 heapify max 只能在初始化时使用 import heapq def
  • 如何将列表转换为队列来实现先进先出

    考虑 public List
  • 是否可以按值删除队列元素?

    我想从队列中删除具有特定值的元素 这样的事该怎么办呢 我正在尝试创建映射和队列的并发混合 目前我尝试在这个答案 https stackoverflow com questions 7704526 is thare in stl or boo
  • 帮助尝试理解圆形数组中的模运算

    我有一个小问题试图弄清楚模运算是如何计算的 我正在建立一个队列 所以我有一个圆形数组 我无法弄清楚这个模运算是如何工作的 给定 q 一个 5 个元素长度的字符数组 MAX 常量给出数组的最大长度 5 rare 是一个 int 代表数组 q
  • 如何使用 PHPmailer 构建电子邮件队列?

    在插入表后 我已经使用 PHPmailer 构建了一个电子邮件脚本 但是 由于脚本超时 我收到了错误的网关 502 发送 300 多封电子邮件来响应网络请求对我来说听起来不是一个好主意 所以我的问题是如何构建一个在后台发送电子邮件的队列 据
  • 如何将 javascript 函数存储在队列中以便最终执行它们[重复]

    这个问题在这里已经有答案了 我在 javascript 中创建了一个 Queue 类 我想将函数作为数据存储在队列中 这样我就可以建立请求 函数调用 并在需要时响应它们 实际执行函数 有没有什么方法可以将函数存储为数据 有点类似于 setT
  • 如何在 celery task.apply_async 中使用优先级

    我有一个testcelery 中的队列 我为它定义了一个任务 celery app task queue test ignore result True def priority test priority print priority 它
  • 如何在Mule中创建独占队列消费者?

    在 ActiveMQ 中 您可以为队列配置独占消费者 例如 Queue Name Here consumer exclusive true 如何在 Mule 中配置像上面这样的独占消费者 您需要对队列名称进行 URL 编码 因为 Mule
  • 有没有更好的方法来实现队列的删除方法?

    首先 请承认我确实想要一个功能Queue
  • 如何在java中排队并调用实际方法(而不是立即评估)?

    有一个对时间敏感的任务列表 但在这种情况下 时间 对于另一个程序告诉我的内容是任意的 它更像是 滴答声 而不是时间 但是 我不希望立即评估所述方法 我希望一个在另一个完成后执行 我在队列中使用链表 但我不确定如何 是否可以访问类中的实际方法
  • Laravel 5.1 失败的排队作业在 failed() 方法上失败,阻止调用队列失败事件处理程序

    我正在测试 Laravel 5 1 中的队列功能 我可以让作业在我的数据库表中排队 称为作业 并且可以让它们成功运行 我还创建了一个名为 failed jobs 的队列失败表 为了测试它 在作业表中 我操作有效负载数据以使其失败 然后像这样
  • 用于 SQL 更新语句的 Java 单工作线程

    我正在开发一个基于 Java 的服务器 其中有多个线程 每个连接的用户一个线程 一些额外的线程 会涉及到一些数据库连接 所以我在想服务器每次创建一个SELECT查询数据库时 它将为此启动一个新线程 以防止当前线程阻塞 我计划为此使用连接池
  • 使用 Java 中的映射实现的队列数据结构,大小限制为 5

    我有带有一些记录的地图 我想将该映射限制为仅 5 个元素 并且每当添加新元素时 应删除第一个元素 并应在映射的最后位置添加新元素 类似于 FIFO 的东西 任何人都可以建议我使用一个数据结构或解决方案本身 E g Map
  • 我如何在 C++ 中将数组存储到队列

    queue lt int gt qq for int i 0 i lt N i int cc 2 i i 1 qq push cc N很大但不精确 所以我想使用队列 我想存储很多数组来排队 但是 qq 存储的数组是同一个 我该怎么做 你的代
  • 如何自定义BlockingQueue的阻塞行为

    我想创建一个阻塞队列 它根据自定义规则而不是队列中的项目数量来阻止生产者 例如 生产者生成一些文件并放入队列中 消费者经过一番分析后将它们转移到特定位置 对于上述场景 如果队列中的总文件大小达到某个阈值 我希望生产者等待生成新文件 如果总大

随机推荐

  • 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 栈顶的当前位置是动态的 栈顶的当前位置是由一个称为栈顶指针