前言

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

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

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

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


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

两个栈实现一个队列

思路:让数据入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存在元素,则将新插入元素前的所有元素出队,然后依次进队。这样新插入的元素就在队首了。

絮叨

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

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


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

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

  1. deque stack java_一文弄懂java中的Queue家族

    简介 java中Collection集合有三大家族List,Set和Queue.当然Map也算是一种集合类,但Map并不继承Collection接口. List,Set在我们的工作中会经常使用,通常用 ...

  2. 一文弄懂Flink网络流控及反压

    一文弄懂Flink网络流控及反压 1. 为什么需要网络流控? 2. 网络流控的实现:静态限速 3. 网络流控的实现:动态反馈/自动反压 3.1 案例一:Storm 反压实现 3.2 案例二:Spark ...

  3. 【一文弄懂】优先经验回放(PER)论文-算法-代码

    [一文弄懂]优先经验回放(PER)论文-算法-代码 文章目录 [一文弄懂]优先经验回放(PER)论文-算法-代码 前言: 综合评价: 继续前言唠叨 per论文简述: 参考博客: 背景知识 A MOTI ...

  4. 并发、并行、同步、异步、进程,线程、串行、并行?一文弄懂八大概念

    并发.并行.同步.异步.进程,线程.串行.并行?一文弄懂八大概念 参考博文:并发.并行.串行.同步.异步的区别? java多线程详解(并发,并行,同步) 文章目录 并发.并行.同步.异步.进程,线程. ...

  5. 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述

    <繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...

  6. 一文弄懂神经网络中的反向传播法

    最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...

  7. 一文弄懂各种loss function

    有模型就要定义损失函数(又叫目标函数),没有损失函数,模型就失去了优化的方向.大家往往接触的损失函数比较少,比如回归就是MSE,MAE,分类就是log loss,交叉熵.在各个模型中,目标函数往往都是 ...

  8. 一文弄懂神经网络中的反向传播法——BackPropagation【转】

    本文转载自:https://www.cnblogs.com/charlotte77/p/5629865.html 一文弄懂神经网络中的反向传播法--BackPropagation 最近在看深度学习的东 ...

  9. 一文弄懂String的所有小秘密

    文章目录 简介 String是不可变的 传值还是传引用 substring() 导致的内存泄露 总结 一文弄懂String的所有小秘密 简介 String是java中非常常用的一个对象类型.可以说ja ...

最新文章

  1. 魔幻!2021年,6种将死的编程语言?
  2. SpringCloud Zuul初体验
  3. 线性表C语言locate和ETget,线性表(数据结构重难点讲解)
  4. 汉语言处理包 HanLP 1.7.3 发布,常规维护版本
  5. linux中各目录及详细介绍
  6. SchemaSpy:数据库构架文档生产器,以及该软件的部分缺陷修改。提供工具包下载...
  7. [No0000BC]ADO.NET中的几个主要对象
  8. vue 项目加载顺序_如何提高Vue项目首页的加载速度
  9. mysql工作中遇到的问题_mysql - 工作中碰到的问题
  10. 读书笔记《高性能网站建设指南:前端工程师技能精髓》
  11. 想转行做web前端工程师,必学这6大技能
  12. 未来人在数据分析中的角色转变
  13. HDU2030-汉字机内码
  14. 多媒体多模态系统:智能(记忆对话)小爱同学,nie li qiang
  15. 投影幕布尺寸计算器_投影幕尺寸是怎么算的
  16. kubectl describe pod 里边没有看到events问题解决【详细步骤】
  17. 骁龙780g相当于什么处理器 骁龙780g什么水平
  18. 手机计算机怎么打出无限符号,Win7怎么用搜狗打无限符号|输入法打无限符号方法...
  19. Visual studio —— error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “StdAfx.h“”?
  20. python生成快递取件码_快递,顺丰,python,截图,15Seconds

热门文章

  1. 【Java 网络编程】客户端 Socket 创建
  2. 认真工作的原因以及方法
  3. 生活实遇记-Kindle好久没用,屏幕一直处于电池状态,怎么解决?
  4. mybatis映射器${}和#{}的区别
  5. ExtJS4.1.1 设置表格背景颜色 修改文本颜色 在表格中插入图片
  6. Android --- 图片的特效处理
  7. 游戏玩家行为基本模式的初探小汇
  8. CCF CSP 201612-1中位数(满分代码)
  9. 我知道你会用Jupyter Notebook,但这些插件你都会了吗?
  10. WireShark 实例分析笔记(概念)