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

    文章

    4454

    浏览量

    90747
  • 数据结构
    +关注

    关注

    3

    文章

    564

    浏览量

    39899
  • 元素
    +关注

    关注

    0

    文章

    47

    浏览量

    8372

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

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

收藏 人收藏

    评论

    相关推荐

    什么是步进电机?步进电机分哪几种?

    电子发烧友网站提供《什么是步进电机?步进电机分哪几种?.pdf》资料免费下载
    发表于 11-28 14:21 1次下载
    什么是步进电机?步进电机分<b class='flag-5'>哪几种</b>?

    无锁队列解决的问题

    为什么需要无锁队列 无锁队列解决了什么问题?无锁队列解决了锁引起的问题。 cache失效 当CPU要访问主存的时候,这些数据首先要被copy到cache中,因为这些数据在不久的将来可能又会被处理器
    的头像 发表于 11-10 15:33 264次阅读
    无锁<b class='flag-5'>队列</b>解决的问题

    如何实现一个多读多写的线程安全的无锁队列

    在ZMQ无锁队列的原理与实现一文中,我们已经知道了ypipe可以实现一线程写一线程读的无锁队列,那么其劣势就很明显了,无法适应多写多读的场景,因为其在读的时候没有对r指针加锁,在写的时
    的头像 发表于 11-08 15:25 438次阅读
    如何<b class='flag-5'>实现</b>一个多读多写的线程安全的无锁<b class='flag-5'>队列</b>

    硅片有哪几种晶向?有几种定位边?定位边是如何定位的?

    硅片是大多数芯片的载体。但是一块硅片中却隐藏了很多不为人知的细节,比如:硅片有哪几种晶向?有几种定位边?定位边是如何定位的?定位边与定位槽有什么区别?等等。今天就来详细讲解一下。
    的头像 发表于 10-29 10:33 4866次阅读
    硅片有<b class='flag-5'>哪几种</b>晶向?有<b class='flag-5'>几种</b>定位边?定位边是如何定位的?

    单片机裸机实现队列功能的方案

    单片机裸机实现队列功能的方案
    的头像 发表于 10-17 14:34 315次阅读

    EMI滤波器有哪几种应用和选择?

    EMI滤波器有哪几种应用和选择?|深圳比创达EMC
    的头像 发表于 10-09 10:32 883次阅读
    EMI滤波器有<b class='flag-5'>哪几种</b>应用和选择?

    队列实现栈的两种方法

    两个队列实现一个栈 思路:两个队列实现一个栈,使用了队列交换的思想。 代码如下: type MyStack struct { queue1,
    的头像 发表于 10-08 16:01 423次阅读

    两个栈实现一个队列方法

    数据结构,同时也存在某种联系。用栈可以实现队列,用队列也可以实现栈。 两个栈实现一个队列 思路:
    的头像 发表于 10-08 15:54 579次阅读

    嵌入式开发中消息队列实现

    在嵌入式开发中经常会看到消息队列的身影,队列的应用是很广泛的,它可以应用的场景有很多,比如缓存通信消息,暂存执行内容,数据顺序转发等的操作。
    发表于 08-22 11:19 526次阅读
    嵌入式开发中消息<b class='flag-5'>队列</b>的<b class='flag-5'>实现</b>

    FreeRTOS消息队列介绍

    队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之间要交流的数据保存在队列中,叫做
    的头像 发表于 07-06 16:58 484次阅读
    FreeRTOS消息<b class='flag-5'>队列</b>介绍

    RTOS消息队列的应用

    基于RTOS的应用中,通常使用队列机制实现任务间的数据交互,一个应用程序可以有任意数量的消息队列,每个消息队列都有自己的用途。
    发表于 05-29 10:49 420次阅读
    RTOS消息<b class='flag-5'>队列</b>的应用

    单片机消息队列实现原理和机制

    单片机开发过程中通常会用到“消息队列”,一般实现的方法有多种。 本文给大家分享一下队列实现的原理和机制。
    的头像 发表于 05-26 09:50 867次阅读
    单片机消息<b class='flag-5'>队列</b>的<b class='flag-5'>实现</b>原理和机制

    利用C++提供的队列封装一个消息队列

    最近的C++项目中,需要用到消息队列,但是C++中又没有原生的消息队列,就在网上找了一下相关资料,利用C++提供的队列,自己封装一个消息队列,以后的项目也可以复用。
    的头像 发表于 05-20 15:16 1098次阅读
    利用C++提供的<b class='flag-5'>队列</b>封装一个消息<b class='flag-5'>队列</b>

    嵌入式环形队列和消息队列是如何去实现的?

    嵌入式环形队列和消息队列实现数据缓存和通信的常见数据结构,广泛应用于嵌入式系统中的通信协议和领域。
    发表于 05-20 14:55 670次阅读

    ESD模型有哪几种你知道吗?

    ESD模型有哪几种你知道吗?
    的头像 发表于 05-09 10:00 1168次阅读
    ESD模型有<b class='flag-5'>哪几种</b>你知道吗?