0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

队列实现栈原理是什么?队列实现栈方案有哪几种?

Android编程精选 来源:编程学习总站 作者:写代码的牛顿 2021-07-04 13:28 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1、队列实现栈原理简述

栈是一种后进先出的数据结构,而队列是一种先进先出的数据结构,两者原理不难理解,使用也简单。但是我们不仅仅要掌握数据结构的基本原理,还要学会灵活运用,能否灵活运用是考察一个人对数据结构的理解程度,也是在面试的时候经常会考到的知识点。现在假设面试官要求你用队列实现栈,你的解决方案是什么?通过栈的基本原理我们知道,只要每次进行stack_pop操作时将队列里最后一个元素输出就能模拟栈的输出操作。

2、队列实现栈方案和实现

方案1:

我们很容易想到一种解决方案,队列queue1保存原始输入数据,队列queue2作为临时队列缓存数据,只要进行stack_pop操作时,先将queue1里除最后一个元素外全部出队,且出队的数据保存在一个临时队列queue2里,保存queue1最后的元素,最后再将queue2里的全部元素出队,且出队的元素重新放进queue1里,返回保存的queue1最后的元素。

我们作了下图便于理解2个队列模拟栈的过程。

一个栈输出元素顺序

pYYBAGDhSEyAdw4iAAASk34tfNs779.jpg

两个队列queue1和queue2模拟栈

poYBAGDhSFSAD2xuAABApH0Njto619.jpg

在数据结构与算法篇-队列和数据结构与算法篇-栈文章里我们详细介绍了队列和栈的原理,并都用C实现了队列和栈。现在我们复用这两篇文章里队列的实现代码,用于实现栈。定义栈相关数据结构和操作函数代码如下:

poYBAGDhSF6AElBAAAB5DbpRGCo582.jpg

栈初始化函数实现:

poYBAGDhSGuATGupAABDbwkUz54998.jpg

栈销毁函数实现:

pYYBAGDhSHeACJ0jAAA5-j_6l6c146.jpg

入栈函数实现:

poYBAGDhSICAXrdRAAAxX-RjUj8740.jpg

出栈函数实现:

pYYBAGDhSIqASGSQAAB8F1Mp3es586.jpg

判断栈是否空和是否满函数实现:

poYBAGDhSJyAIFsaAABW1UkhDxU770.jpg

从方案1我们知道每次出队都需要将队列里除最后一个元素外的元素保存在另外一个临时队列里,增加了空间复杂度。那么能否只用一个队列能否模拟栈呢?通过仔细观察方案1发现queue1出对的数据是可以重新再入队的,只要让队列里最后一个元素在队列头即可,那么我们很容易想到方案2。 方案2: 将队列queue1里的数据依次出队,且出队的数据重新放在queue1的队尾,直到最后一个元素在队列头,最后输出队列头的元素即可。整个过程我们可以用下图表示。单个队列模拟栈

poYBAGDhSKaAeLi6AAA3CEypaKE570.jpg

单个队列模拟出栈函数实现如下:

pYYBAGDhSLCAVo4rAABl3JgrwOM365.jpg

栈实现验证

下面我们写一个小程序验栈实现的正确性。

poYBAGDhSLqAf1UWAADbnrJOENY998.jpg

编译运行输出如下:

pYYBAGDhSMSAJ1tIAAAysSP7yQc495.jpg

队列模拟栈完全正确。

责任编辑:lq6

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4816

    浏览量

    98744
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    41728
  • 元素
    +关注

    关注

    0

    文章

    47

    浏览量

    8781

原文标题:数据结构与算法篇-队列实现栈

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RDMA设计43:队列删除及连接断开功能测试

    在接收到正确的删除队列请求后,首先进入连接断开流程,即四次挥手断链,如图中红框部分。随后进行队列删除操作。返回队列操作状态 0x2b,符合设计预期,验证通过。
    的头像 发表于 02-24 07:50 708次阅读
    RDMA设计43:<b class='flag-5'>队列</b>删除及连接断开功能测试

    CW32单片机支持哪几种开发环境,比较常用的MDK支持吗?

    CW32单片机支持哪几种开发环境,比较常用的MDK支持吗。 若使用MDK开发,是否也需要下载芯片包,导入到MDK中?xxx32的库可以用吗。
    发表于 01-26 06:14

    RDMA设计25:队列管理模块之发送模块详细设计分析

    发送队列存储为所有发送队列共用的存储空间,根据用户环境和开发板环境不同可由 BRAM、URAM 或 LUTRAM 实现。发送队列管理单元则负责管理这个存储空间,并处理用户指令和发送
    的头像 发表于 01-25 16:27 5902次阅读
    RDMA设计25:<b class='flag-5'>队列</b>管理模块之发送模块详细设计分析

    RDMA设计26:队列管理模块设计之接收队列模块详细分析

    本文主要交流设计思路,在本博客已给出相关博文100多篇,希望对初学者有用。注意这里只是抛砖引玉,切莫认为参考这就可以完成商用IP设计。 (2)接收队列 接收队列由一个接收队列管理单元组成。与发送
    发表于 01-22 09:03

    RDMA设计24:队列管理模块设计

    队列管理模块采用管理与存储分离的结构进行设计,由发送队列存储、发送队列管理、接收队列管理、完成条目解析、异常完成条目处理和 Round-Robin 仲裁组成。
    的头像 发表于 01-20 11:45 1619次阅读
    RDMA设计24:<b class='flag-5'>队列</b>管理模块设计

    请问单片机开发的程序设计语言主要有哪几种

    单片机开发的程序设计语言主要有哪几种
    发表于 01-14 08:29

    RDMA设计17:队列管理模块设计2

    。 (2)接收队列 接收队列由一个接收队列管理单元组成。与发送队列类似的是,接收队列管理单元也由若干表单构成,其中包括 RQ1 表单和用户
    发表于 01-04 14:54

    RDMA设计12:融合以太网协议设计1

    RDMA 队列实现 RDMA 指令提交与完成机制。在 RoCE v2 高速数据传输系统中,用户通过配置系统控制模块中的寄存器或寄存器组来实现队列管理和数据 DMA 请求。融合以太网
    发表于 12-25 11:39

    高性能网络存储设计:NVMe-oF IP的实现探讨

    中间映射,该机制实现了NVMeoF与NVMe之间的软硬件解耦、队列虚拟化、并行事务动态调度,显著提升系统可扩展性与调度灵活度。 ③ RAID0 横向扩展的多通道NVMe聚合架构 系统提供 面向高吞吐场景
    发表于 12-19 18:45

    NVMe高速传输之摆脱XDMA设计54:如何测试队列管理功能2

    , 表示操作顺序错误; 创建 I/O 完成队列和提交队列后, 先删除完成队列, 返回错误值为 8, 表示操作顺序错误。 打印信息显示测试结果与预期设计功能一致, 成功执行了队列的创建和
    发表于 12-10 08:33

    优先级队列介绍

    队列(Queue)的知识点:「概念」:队列是一种先进先出(FIFO)的数据结构,类似于排队的概念。「基本操作」:enqueue(item): 将元素添加到队列的末尾。dequeue(): 从
    发表于 11-26 07:56

    基于环形队列的UART收发回显实验

    问题。在本实验中,我们使用环形队列实现实验1的串口收发回显,将串口接收到的数据暂存在队列中,待完成一次接收后再将队列中的数据全部发出去。
    的头像 发表于 10-27 13:51 2205次阅读
    基于环形<b class='flag-5'>队列</b>的UART收发回显实验

    自动驾驶中常提的“全”是个啥?必要“全”吗?

    [首发于智驾最前沿微信公众号]随着自动驾驶技术落地,越来越多车企公布了自己的自动驾驶方案,在很多车企的宣传中,会使用“全自研”的说法来证明自己的实力。所谓“全”,字面意思是全套技术
    的头像 发表于 08-27 09:43 1536次阅读
    自动驾驶中常提的“全<b class='flag-5'>栈</b>”是个啥?<b class='flag-5'>有</b>必要“全<b class='flag-5'>栈</b>”吗?

    NVMe高速传输之摆脱XDMA设计九:队列管理模块设计(上)

    条目,一个提交队列管理单元用于实现提交队列存储地址空间的管理和门铃控制。在提交队列管理单元中,构建一个admin提交队列表单和N个I/O提交
    发表于 07-27 17:41

    RabbitMQ消息队列解决方案

    在现代分布式系统架构中,消息队列作为核心组件,承担着系统解耦、异步处理、流量削峰等重要职责。RabbitMQ作为一款成熟的消息队列中间件,以其高可用性、高可靠性和丰富的特性,成为众多企业的首选方案。本文将从运维工程师的角度,详细
    的头像 发表于 07-08 15:55 802次阅读