栈和队列互相实现,一文弄懂它们的关系
前言
栈和队列是比较基础的数据结构。无论在工作中,还是在面试中,栈和队列都用的比较多。在计算机的世界,你会看到队列和栈,无处不在。
栈:一个先进后出的数据结构
队列:一个先进先出的数据结构
栈和队列这两种数据结构,同时也存在某种联系。用栈可以实现队列,用队列也可以实现栈。
海边风景不错,欣赏一下风景,下面开始步入正题。学完这篇,咱们再接着看风景。
两个栈实现一个队列
思路:让数据入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存在元素,则将新插入元素前的所有元素出队,然后依次进队。这样新插入的元素就在队首了。
絮叨
栈和队列作为基础的数据,大家务必掌握其性质和功能,知道它们之间的某种依存关系,才能灵活运用。
上面的算法虽然很简单,但是思路很巧妙,还有其他解法,大家也可仔细研究,必有收获。有本数据结构的书<<大话数据结构>>推荐给大家。
专注后台开发相关技术,广度深度并存,干货情怀同在。
微信搜索【盼盼编程】关注这个不一样的程序员。
栈和队列互相实现,一文弄懂它们的关系相关推荐
- deque stack java_一文弄懂java中的Queue家族
简介 java中Collection集合有三大家族List,Set和Queue.当然Map也算是一种集合类,但Map并不继承Collection接口. List,Set在我们的工作中会经常使用,通常用 ...
- 一文弄懂Flink网络流控及反压
一文弄懂Flink网络流控及反压 1. 为什么需要网络流控? 2. 网络流控的实现:静态限速 3. 网络流控的实现:动态反馈/自动反压 3.1 案例一:Storm 反压实现 3.2 案例二:Spark ...
- 【一文弄懂】优先经验回放(PER)论文-算法-代码
[一文弄懂]优先经验回放(PER)论文-算法-代码 文章目录 [一文弄懂]优先经验回放(PER)论文-算法-代码 前言: 综合评价: 继续前言唠叨 per论文简述: 参考博客: 背景知识 A MOTI ...
- 并发、并行、同步、异步、进程,线程、串行、并行?一文弄懂八大概念
并发.并行.同步.异步.进程,线程.串行.并行?一文弄懂八大概念 参考博文:并发.并行.串行.同步.异步的区别? java多线程详解(并发,并行,同步) 文章目录 并发.并行.同步.异步.进程,线程. ...
- 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述
<繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...
- 一文弄懂神经网络中的反向传播法
最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...
- 一文弄懂各种loss function
有模型就要定义损失函数(又叫目标函数),没有损失函数,模型就失去了优化的方向.大家往往接触的损失函数比较少,比如回归就是MSE,MAE,分类就是log loss,交叉熵.在各个模型中,目标函数往往都是 ...
- 一文弄懂神经网络中的反向传播法——BackPropagation【转】
本文转载自:https://www.cnblogs.com/charlotte77/p/5629865.html 一文弄懂神经网络中的反向传播法--BackPropagation 最近在看深度学习的东 ...
- 一文弄懂String的所有小秘密
文章目录 简介 String是不可变的 传值还是传引用 substring() 导致的内存泄露 总结 一文弄懂String的所有小秘密 简介 String是java中非常常用的一个对象类型.可以说ja ...
最新文章
- 魔幻!2021年,6种将死的编程语言?
- SpringCloud Zuul初体验
- 线性表C语言locate和ETget,线性表(数据结构重难点讲解)
- 汉语言处理包 HanLP 1.7.3 发布,常规维护版本
- linux中各目录及详细介绍
- SchemaSpy:数据库构架文档生产器,以及该软件的部分缺陷修改。提供工具包下载...
- [No0000BC]ADO.NET中的几个主要对象
- vue 项目加载顺序_如何提高Vue项目首页的加载速度
- mysql工作中遇到的问题_mysql - 工作中碰到的问题
- 读书笔记《高性能网站建设指南:前端工程师技能精髓》
- 想转行做web前端工程师,必学这6大技能
- 未来人在数据分析中的角色转变
- HDU2030-汉字机内码
- 多媒体多模态系统:智能(记忆对话)小爱同学,nie li qiang
- 投影幕布尺寸计算器_投影幕尺寸是怎么算的
- kubectl describe pod 里边没有看到events问题解决【详细步骤】
- 骁龙780g相当于什么处理器 骁龙780g什么水平
- 手机计算机怎么打出无限符号,Win7怎么用搜狗打无限符号|输入法打无限符号方法...
- Visual studio —— error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “StdAfx.h“”?
- python生成快递取件码_快递,顺丰,python,截图,15Seconds