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

    文章

    4622

    浏览量

    93068
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    40159
  • 元素
    +关注

    关注

    0

    文章

    47

    浏览量

    8451

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

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

收藏 人收藏

    评论

    相关推荐

    JavaWeb消息队列使用指南

    在现代的JavaWeb应用中,消息队列(Message Queue)是一种常见的技术,用于异步处理任务、解耦系统组件、提高系统性能和可靠性。 1. 消息队列的基本概念 消息队列是一种应用程序对应
    的头像 发表于 11-25 09:27 164次阅读

    Linux网络协议实现

    网络协议是操作系统核心的一个重要组成部分,负责管理网络通信中的数据包处理。在 Linux 操作系统中,网络协议(Network Stack)负责实现 TCP/IP 协议簇,处理应用程序发起的网络
    的头像 发表于 09-10 09:51 331次阅读
    Linux网络协议<b class='flag-5'>栈</b>的<b class='flag-5'>实现</b>

    嵌入式环形队列与消息队列实现原理

    嵌入式环形队列,也称为环形缓冲区或循环队列,是一种先进先出(FIFO)的数据结构,用于在固定大小的存储区域中高效地存储和访问数据。其主要特点包括固定大小的数组和两个指针(头指针和尾指针),分别指向队列的起始位置和结束位置。
    的头像 发表于 09-02 15:29 589次阅读

    TCP/IP协议的设计与实现_中文

    电子发烧友网站提供《TCP/IP协议的设计与实现_中文.pdf》资料免费下载
    发表于 07-03 11:28 4次下载

    LwIP协议源码详解—TCP/IP协议的实现

    电子发烧友网站提供《LwIP协议源码详解—TCP/IP协议的实现.pdf》资料免费下载
    发表于 07-03 11:22 3次下载

    断路器哪几种

    断路器哪几种  断路器是一种用于保护电气线路和设备的重要元件,它可以在电路发生短路或过载时自动切断电源,以避免设备损坏和火灾等危险。断路器的种类繁多,根据不同的分类标准,可以分为以下几种: 1.
    的头像 发表于 06-10 16:19 2350次阅读

    基于MM32G5330的FlexCAN实现CANopenNode协议移植

    本文将介绍如何基于灵动MM32G5330的FlexCAN实现CANopenNode协议的移植,并使用灵动官方提供的开发板Mini-G5333进行验证。
    发表于 04-12 09:15 1568次阅读
    基于MM32G5330的FlexCAN<b class='flag-5'>实现</b>CANopenNode协议<b class='flag-5'>栈</b>移植

    进程间通信的消息队列介绍

    消息队列是一种非常常见的进程间通信方式。
    的头像 发表于 04-08 17:27 315次阅读

    MCU专属队列功能模块之QueueForMcu应用

    当需要从队列头部获取多个数据,但又不希望数据从队列中删除时,可以使用 Queue_Peek_Array 函数来实现,该函数的参数与返回值与 Queue_Pop_Array 完全相同。
    发表于 03-20 11:44 526次阅读
    MCU专属<b class='flag-5'>队列</b>功能模块之QueueForMcu应用

    TC399 adc能添加到同一个队列中并得到结果吗?加入队列是否任何限制?

    添加到队列中并得到结果。 我的疑问是,了这些不同的频道和组,我还能把它们添加到同一个队列中并得到结果吗?加入队列是否任何限制?
    发表于 03-04 06:33

    变压器的调压方式哪几种

    常见的大功率级别的调压方式哪些? 变压器调压又分为哪几种形式? 调压入合调压出合调压入分调压出分这几个概念分别是什么意思?
    发表于 02-21 15:11

    熔断器几种形式 熔断器的灭弧方法哪几种

    熔断器几种形式 熔断器的灭弧方法哪几种? 熔断器是一种用来保护电路免受过电流和过负荷的损坏的电器设备。它们在电力系统和电子设备中广泛应用,也被称为电气保险丝。熔断器
    的头像 发表于 02-06 10:08 2518次阅读

    SPWM哪几种调制方式?各有什么特点?

    SPWM哪几种调制方式?各有什么特点? SPWM 是一种常用的调制技术,用于控制交流电压的形状和频率,以便实现电力电子设备的精确控制。SPWM可以分为基本SPWM和改进SPWM两种调制方式。下面将
    的头像 发表于 02-06 09:45 2947次阅读

    什么是串行端口?哪几种分类?

    什么是串行端口?哪几种分类? 串行端口是计算机中用于进行数据传输的一种接口类型,通过单一的数据线逐位地传输数据。与串行端口相对应的是并行端口,与串行端口不同,它使用多条数据线同时传输数据。 串行
    的头像 发表于 02-02 15:40 2173次阅读

    裸机中环形队列与RTOS中消息队列有何区别呢?

    “环形队列”和“消息队列”在嵌入式领域应用非常广泛,相信经验的嵌入式软件工程师对它们都不陌生。
    的头像 发表于 01-26 09:38 728次阅读
    裸机中环形<b class='flag-5'>队列</b>与RTOS中消息<b class='flag-5'>队列</b>有何区别呢?