栈和队列互相实现,一文弄懂它们的关系

2023-05-16

 

前言

栈和队列是比较基础的数据结构。无论在工作中,还是在面试中,栈和队列都用的比较多。在计算机的世界,你会看到队列和栈,无处不在。
 

栈:一个先进后出的数据结构

队列:一个先进先出的数据结构
 

栈和队列这两种数据结构,同时也存在某种联系。用栈可以实现队列,用队列也可以实现栈。

 

图片
海边风景不错,欣赏一下风景,下面开始步入正题。学完这篇,咱们再接着看风景。

 

两个栈实现一个队列

思路:让数据入stack1,然后栈stack1中的数据出栈并入到栈stack2,然后出stack2。

代码如下:

type CQueue struct {
    stack1, stack2 *list.List
}

//构造函数    
func Constructor() CQueue {
        return CQueue{
        stack1: list.New(),
        stack2: list.New(),
    }
}
    
//尾部插入
func (this *CQueue) AppendTail(value int)  {
    this.stack1.PushBack(value)
}

//头部删除,back函数返回其list最尾部的值
func (this *CQueue) DeleteHead() int {
    //如果第二个栈为空
    if this.stack2.Len() == 0 {
        for this.stack1.Len() > 0 {
            this.stack2.PushBack(this.stack1.Remove(this.stack1.Back()))
        }
    }
    if this.stack2.Len() != 0 {
        e := this.stack2.Back()
        this.stack2.Remove(e)
        return e.Value.(int)
    }
    return -1
}


先调用 AppendTail 函数将所有元素插入 stack1,在调用 DeleteHead 函数将 stack1 中的元素转移到 stack2 中,再将元素再出栈。

再调用 DeleteHead 时,先判断 statck2 是否为空,为空则将 stack1 元素移动到 stack2 中,然后将 stack2 中的栈顶元素保存,并弹栈。

 

两个队列实现一个栈

思路:两个队列实现一个栈,使用了队列交换的思想。
 

代码如下:

type MyStack struct {
    queue1, queue2 []int
}

//构造函数
func Constructor() (s MyStack) {
    return
}

func (s *MyStack) Push(x int) {
    s.queue2 = append(s.queue2, x)
    for len(s.queue1) > 0 {
        s.queue2 = append(s.queue2, s.queue1[0])
        s.queue1 = s.queue1[1:]
    }
    s.queue1, s.queue2 = s.queue2, s.queue1
}

func (s *MyStack) Pop() int {
    v := s.queue1[0]
    s.queue1 = s.queue1[1:]
    return v
}

func (s *MyStack) Top() int {
    return s.queue1[0]
}

func (s *MyStack) Empty() bool {
    return len(s.queue1) == 0
}

 

先将元素入对到 queue2,此时 queue1 为0,交换 queue2 和 queue1。此时 queue2 为0,queue1 中有1个元素。

再执行push操作时,len(queue1) > 0,此时再把 queue1 中的元素插入queue2 的尾部,然后将 queue2 和 queue1 进行交换。
此时相当于,插入 queue2 的两个元素的位置发生了交换并保存在 queue1中。最后将 queue1 中的元素出队,这样就可以保证后插入的元素先出。

不断执行 push 操作就行。

  

一个队列实现一个栈

思路:使用一个队列时,将当前插入元素前面的所有元素,先出队再入队即可。

代码如下:

type MyStack struct {
    queue []int
}

func Constructor() (s MyStack) {
    return
}

func (s *MyStack) Push(x int) {
    n := len(s.queue)
    s.queue = append(s.queue, x)
    for ; n > 0; n-- {
        s.queue = append(s.queue, s.queue[0])
        s.queue = s.queue[1:]
    }
}

func (s *MyStack) Pop() int {
    v := s.queue[0]
    s.queue = s.queue[1:]
    return v
}

func (s *MyStack) Top() int {
    return s.queue[0]
}

func (s *MyStack) Empty() bool {
    return len(s.queue) == 0
}


每次执行 push 操作,如果queue存在元素,则将新插入元素前的所有元素出队,然后依次进队。这样新插入的元素就在队首了。

 

絮叨

栈和队列作为基础的数据,大家务必掌握其性质和功能,知道它们之间的某种依存关系,才能灵活运用。

上面的算法虽然很简单,但是思路很巧妙,还有其他解法,大家也可仔细研究,必有收获。有本数据结构的书<<大话数据结构>>推荐给大家。

图片

 


专注后台开发相关技术,广度深度并存,干货情怀同在。
微信搜索【盼盼编程】关注这个不一样的程序员。

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

栈和队列互相实现,一文弄懂它们的关系 的相关文章

  • Android9.0 iptables用Netd实现创建子链功能的实现

    1 前言 在9 0的系统rom定制化开发中 在system中netd网络这块的产品需要中 会要求设置屏蔽ip地址之内的功能 liunx中iptables命令也是比较重要的 接下来就来在Netd这块实现创建子链的相关功能 2 nbsp ipt
  • hibernate all elements are null

    Hibernate查出集合里面的对象全部为空原因分析 hibernate查单表 xff0c 在后台可是看到生成的sql语句 xff0c sql正确 xff0c 返回的list中可以看到返回的对象数目 xff0c 但是里面的对象都是null
  • maven项目无法解析插件

    发现问题 使用IDEA创建Maven项目时 xff0c 报错无法解析插件 org apache maven plugins maven clean plugin 这里使用的是IDEA捆绑的Maven插件 解决方案 查看Maven配置 打开用
  • WPF ItemContainerGenerator.ContainerFromItem返回Null

    解决办法 xff1a 1 设置DataGrid 属性VirtualizingStackPanel IsVirtualizing 61 34 False 34 2 动态设置 xff1a 如果后台代码返回null xff0c 例如 xff0c
  • 实现两个数据库之间的数据同步

    不同服务器数据库之间的数据操作 创建链接服务器 exec sp addlinkedserver 39 ITSV 39 39 39 39 SQLOLEDB 39 39 远程服务器名或ip地址 39 exec sp addlinkedsrvlo
  • ABAP SY-系统值

    网址 xff1a http www fu he net sap 4817 html Description SY SUBRC xff1a 语句执行后的返回值 xff0c 0表示成功 SY DATUM xff1a 当前服务器日期 SY UZE
  • ORA -04098 触发器无效且未通过重新验证

    ORACLE 菜鸟 xff0c 犯了一个低级错误 xff0c 用PowerDesigner的SQL Preview创建表的时候没有创建sequence xff0c 导致新增数据报此错误 xff0c 折腾半天才反应过来 xff01 于是打开P
  • C# ConfigurationManager.ConnectionStrings[""].ConnectionString初始值设定引发异常

    开发的时候遇到这样一个问题 xff1a 在同一个C 项目中有两个Server xff0c 每个Server中有一个web config配置文件 xff0c 两个Server公用一个数据库服务类 xff08 SqlHelper cs xff0
  • SQL SERVER请验证实例名称是否正确并且SQL Server已配置为允许远程连接

    解决办法 xff1a 1 对象资源管理器中右键 方面 进入服务器配置页面 2 选择进入 外围应用配置器 3 将RemoteDacEnbled的属性设为Ture 4 确定 如果还是不行 xff0c 继续如下处理 xff1a 1 进入SQL S
  • A new value is to be assigned to the field 'L_BOX'

    转载 xff1a https www cnblogs com aurora cj p 9353144 html DUMP A new value is to be assigned to the field 34 lt L BOX gt 3
  • 七大Linux桌面介绍:Unity、KDE、GNOME等等

    对于Linux桌面环境来说 xff0c 因为具备着各种独特的设计风格 功能配备以及自身特性 从具体硬件平台上 xff0c 只有通过实际情况才可以判断一款桌面环境究竟能否适合用户的需求 这里就来为大家推荐七款顶级Linux桌面环境选项 一 U
  • Android 10.0 kenel和frameworks中修改ram运行内存的功能实现

    1 前言 nbsp 在10 0的系统rom产品开发定制中 在对一些产品开发中的配置需求方面 在产品后续订单中 产品提出要提高硬件配置 但是硬件方面已经定板 项目时间比较仓促 所以 来不及对硬件重新定制 就需要软件方面在ram运行内存的容量大
  • fft算法总结

    前言 电赛期间总结的FFT算法 一 fft是什么 xff1f FFT xff08 Fast Fourier Transformation xff09 是离散傅氏变换 xff08 DFT xff09 的快速算法 即为快速傅氏变换 它是根据离散
  • 火狐安全软件Huohong

    你还在为垃圾软件 xff0c 恶意弹窗 xff0c 病毒骚扰等而烦扰吗 xff1f 让简约高效的火狐安全软件来帮助你吧 xff01 火绒互联网安全软件 轻巧 高效 超强防御的安全防护软件 功能强悍 xff0c 体量轻巧 xff0c 既干净又
  • 利用scp从Linux上传送文件到windows

    一 下载Git 软件 下载链接 xff1a https git scm com downloads 二 打开Git Bash here 三 输入一下scp命令 红色部分是linux部分 xff1a 用户名 64 ip地址 xff1a 传输文
  • 我又会了json,啊啊啊啊!!!

    这个博主对json的创建与解析很详细哦 博主文章链接 xff1a 文章链接
  • vscode查找快捷键

    全局查找 xff1a ctrl 43 p文件内部查找 xff1a ctrl 43 f
  • 51单片机100倒计时

    目标 xff1a 基于51单片机的定时器在数码管上显示100s倒计时 xff0c 计时结束后led灯全亮 上面是我的开发版的原理图 xff0c 晶振是11 0592MHZ 找不到STC89C5xRC h的可以用AT89 xff0c 把头文件
  • Linux下的crontab定时执行任务命令详解

    在LINUX中 xff0c 周期执行的任务一般由cron这个守护进程来处理 ps ef grep cron cron读取一个或多个配置文件 xff0c 这些配置文件中包含了命令行及其调用时间 cron的配置文件称为 crontab xff0

随机推荐

  • golang密码加密解密

    简介 最近正在迁移自己的小项目 xff0c 项目之前是基于Laravel5 5开发的 整个用户登陆也是基于框架的 Auth 包认证的 其中用户密码这块也是用到了PHP内置的函数password hash xff0c 用它进行密码加密 而且
  • Android9.0 iptables用Netd实现删除子链功能的实现

    1 前言 在9 0的系统rom定制化开发中 在system中netd网络这块的产品需要中 会要求设置屏蔽ip地址之内的功能 liunx中iptables命令也是比较重要的 接下来就来在INetd这块实现删除创建子链的相关功能 2 nbsp
  • golang错误处理

    Go语言主要的设计准则是 xff1a 简洁 明白 xff0c 简洁是指语法和C类似 xff0c 相当的简单 xff0c 明白是指任何语句都是很明显的 xff0c 不含有任何隐含的东西 xff0c 在错误处理方案的设计中也贯彻了这一思想 我们
  • golang使用gdb

    GDB调试简介 GDB是FSF 自由软件基金会 发布的一个强大的类UNIX系统下的程序调试工具 使用GDB可以做如下事情 xff1a 启动程序 xff0c 可以按照开发者的自定义要求运行程序 可让被调试的程序在开发者设定的调置的断点处停住
  • Go怎么写测试用例

    如何编写测试用例 由于go test命令只能在一个相应的目录下执行所有文件 xff0c 所以我们接下来新建一个项目目录gotest 这样我们所有的代码和测试代码都在这个目录下 接下来我们在该目录下面创建两个文件 xff1a gotest g
  • golang应用日志

    seelog介绍 seelog是用Go语言实现的一个日志系统 xff0c 它提供了一些简单的函数来实现复杂的日志分配 过滤和格式化 主要有如下特性 xff1a XML的动态配置 xff0c 可以不用重新编译程序而动态的加载配置信息 支持热更
  • golang网站错误处理

    我们的Web应用一旦上线之后 xff0c 那么各种错误出现的概率都有 xff0c Web应用日常运行中可能出现多种错误 xff0c 具体如下所示 xff1a 数据库错误 xff1a 指与访问数据库服务器或数据相关的错误 例如 xff0c 以
  • golang应用部署

    程序开发完毕之后 xff0c 我们现在要部署Web应用程序了 xff0c 但是我们如何来部署这些应用程序呢 xff1f 因为Go程序编译之后是一个可执行文件 xff0c 编写过C程序的读者一定知道采用daemon就可以完美的实现程序后台持续
  • golang备份和恢复

    我们经常会遇到生产服务器的网络断了 硬盘坏了 操作系统崩溃 或者数据库不可用了等各种异常情况 xff0c 所以维护人员需要对生产服务器上的应用和数据做好异地灾备 xff0c 冷备热备的准备 在接下来的介绍中 xff0c 讲解了如何备份应用
  • golang自定义路由器设计

    HTTP路由组件负责将HTTP请求交到对应的函数处理 或者是一个struct的方法 xff0c 如前面小节所描述的结构图 xff0c 路由在框架中相当于一个事件处理器 xff0c 而这个事件包括 xff1a 用户请求的路径 path 例如
  • golang中的Session支持

    session集成 beego中主要有以下的全局变量来控制session处理 xff1a related to session SessionOn bool 是否开启session模块 xff0c 默认不开启 SessionProvider
  • golang表单及验证支持

    在Web开发中对于这样的一个流程可能很眼熟 xff1a 打开一个网页显示出表单 用户填写并提交了表单 如果用户提交了一些无效的信息 xff0c 或者可能漏掉了一个必填项 xff0c 表单将会连同用户的数据和错误问题的描述信息返回 用户再次填
  • sublime搭建C/C++编译环境

    代码一 xff1a 34 cmd 34 34 g 43 43 34 34 file 34 34 std 61 c 43 43 11 34 34 o 34 34 file path file base name 34 34 amp 34 34
  • golang用户认证

    在开发Web应用过程中 xff0c 用户认证是开发者经常遇到的问题 xff0c 用户登录 注册 登出等操作 xff0c 而一般认证也分为三个方面的认证 HTTP Basic和 HTTP Digest认证第三方集成认证 xff1a QQ 微博
  • golang多语言支持

    专注后台开发相关技术 xff0c 广度深度并存 xff0c 干货情怀同在 微信搜索 盼盼编程 关注这个不一样的程序员 强烈推荐人工智能学习网站 beego中设置全局变量如下 xff1a Translation i18n IL Lang st
  • golang中的pprof支持

    专注后台开发相关技术 xff0c 广度深度并存 xff0c 干货情怀同在 微信搜索 盼盼编程 关注这个不一样的程序员 强烈推荐人工智能学习网站 Go语言有一个非常棒的设计就是标准库里面带有代码的性能监控工具 xff0c 在两个地方有包 xf
  • 大厂动态规划面试汇总,提升内功

    注 xff1a 本文是BAT真题收录很值得大家花心思看完 xff0c 看完会有收获 前言 算法是面试大公司必考的项目 xff0c 所以面试前准备好算法至关重要 xff0c 今天整理的常见的动态规划题目 xff0c 希望可以帮到大家 要想学习
  • 进程知识点,只需这一篇

    前言 你的进程 xff0c 为啥挂了 xff1f 进程挂了 xff0c 这个问题大家并不陌生 学完这篇 xff0c 你会对进程有一定了解 后面碰到进程挂的情况 xff0c 你很快能找到对应解决思路 进程在操作系统中 xff0c 是一个很重要
  • 算法:多数元素,多种解法

    前言 xff1a 以前做数学题的时候 xff0c 老师说 xff1a 你们学习多种解题方法 遇到类似不同的问题 xff0c 你都会了 xff0c 这样能提高解题能力 如果你写出多种解法 xff0c 面试官会对你刮目相看 下面一题 xff0c
  • 栈和队列互相实现,一文弄懂它们的关系

    前言 栈和队列是比较基础的数据结构 无论在工作中 xff0c 还是在面试中 xff0c 栈和队列都用的比较多 在计算机的世界 xff0c 你会看到队列和栈 xff0c 无处不在 栈 xff1a 一个先进后出的数据结构 队列 xff1a 一个