day9 | 栈与队列 part-1 (Go) | 232 用栈实现队列、225 用队列实现栈

今日任务 

  • 栈与队列的理论基础 (介绍:代码随想录)
  • 232 用栈实现队列(题目:  . - 力扣(LeetCode))
  • 225 用队列实现栈 (题目: . - 力扣(LeetCode) )

栈与队列的理论基础

        栈 : 先进后出    队列: 后进先出

        老师给的讲解:代码随想录   这个可能适合于 c++的同学理解,我的 go 看这里是有点不明所以..


232 用栈实现队列

        请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

说明:

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to toppeek/pop from topsize, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

想法:

        其实我完全理解栈与队列的特性, 先进后出、先进先出嘛, 但是一开始明白这题让干嘛的,在想这是否跟语言有关啊? 下一步直接看题解Go代码,

问题:

        看了题解才明白,其实我们就是可以利用各种语言提供的数据类型, 去模拟实现栈的一个效果,栈就是要具有 push 、pop、top、empty 这几个操作.  然后再用栈去实现 队列的操作:push、pop、peek、empty.

        那么理解了题意后,才是该思考的问题了,如何用拥有栈特性的数据结构去实现拥有队列属性的数据结构呢??🤔🤔

解决思路:

        使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈,这里要注意输入栈和输出栈的关系。       

        就是我们将数据 push 到栈里了,这时该如何将第一个 push 到栈的数据通过 pop给先取出来呢? 我们可以借助另一个栈2,将我们另一个栈的数据 全取出来,再 push 到栈 2 里了,这时的栈 2 的元素出栈的顺序就和我们的队列相同了.

        

图片和题解参考:代码随想录

 看代码(Go):

// 先用切片模拟栈,再用两个栈的特性去模拟一个队列的特性
//  1、通过切片实现一个栈的各种操作
type MyStack []intfunc (s *MyStack) Push(v int){*s = append(*s,v)
}func (s *MyStack) Pop() int {val := (*s)[len(*s)-1]*s = (*s)[:len(*s)-1]return val
}func (s *MyStack) Peek() int {val := (*s)[len(*s)-1]return val
}func (s *MyStack) Size() int {return len(*s)
}func (s *MyStack) Empty() bool{return s.Size() == 0
}// 2、下面开始用两个栈实现队列
type MyQueue struct {inStack *MyStackoutStack *MyStack
}func Constructor() MyQueue {return MyQueue {inStack: &MyStack{},outStack: &MyStack{},}
}func (this *MyQueue) Push(x int)  {this.inStack.Push(x)
}// 在取之前,要先把入栈里的元素全都取出放到出栈里(如果出栈里仍有数据的话,肯定还是可以直接出的)
func (this *MyQueue) Pop() int {this.moveStack()return this.outStack.Pop()
}func (this *MyQueue) Peek() int {this.moveStack()return this.outStack.Peek()
}func (this *MyQueue) Empty() bool {return this.inStack.Empty() && this.outStack.Empty()
}func (this *MyQueue) moveStack() {// 如果出栈为空的时候,再将入栈里的数据全都移动到出栈里,这样保证所有数据一直按照先进先出的顺序来的if this.outStack.Empty() {for !this.inStack.Empty() {this.outStack.Push(this.inStack.Pop())}}
}

225 用队列实现栈

        请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

注意:

  • 你只能使用队列的标准操作 —— 也就是 push to backpeek/pop from frontsize 和 is empty 这些操作。
  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

想法:

        做了上一题后,我们就明白该如何去用语言已有的数据结构去模拟出栈的操作,我直接用切片就能实现栈的操作哎,但是题目还是让我们用两个队列实现,主要还是想要我们理解其中该如何转换.

问题:

       两个队列该如何实现呢? 如果我们像上一题,一个输入一个输出队列模拟还真不行, 因为最后出来的还都是先进先出.

解决思路:

1、两个队列 (题目要求)

        依然还是要用两个队列来模拟栈,只不过没有输入和输出的关系,而是另一个队列完全用来备份的!如下面动画所示,用两个队列que1和que2实现队列的功能,que2其实完全就是一个备份的作用,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1.

2、一个队列 (更优)

        一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。

        

 图片和题解参考:代码随想录 

// 使用1个 队列实现栈的效果type MyStack struct{  // 初始化queue []int}func Constructor() MyStack {return MyStack{queue: make([]int,0),}}func (this *MyStack) Push(x int){// 添加元素this.queue = append(this.queue,x)
}func (this *MyStack) Pop() int {// 取出元素,因为我们当前是模拟在队列里的,遵守了一个先进先出的顺序,那么为了实现栈,我们要实现后进先出的效果n := len(this.queue)-1  // 判断长度// 除了最后一个元素,其余的都重新添加到队列里for n != 0{val := this.queue[0]// 截掉第一个元素,即将加入到队尾this.queue=this.queue[1:]this.queue=append(this.queue,val)n--}// 弹出元素val := this.queue[0]this.queue = this.queue[1:]return val
}func (this *MyStack) Top() int {val := this.Pop()// 先弹出来,再添加进去,虽然这个过程也挺无语的,就是先来了个 for 循环把最后一个元素取出来了,然后再推进去.this.Push(val)return val
}func (this *MyStack) Empty() bool {return len(this.queue) == 0
}// 两个队列实现的
type MyStack struct {//创建两个队列queue1 []intqueue2 []int
}func Constructor() MyStack {return MyStack{	//初始化queue1:make([]int,0),queue2:make([]int,0),}
}func (this *MyStack) Push(x int)  {//先将数据存在queue2中this.queue2 = append(this.queue2,x)	//将queue1中所有元素移到queue2中,再将两个队列进行交换this.Move() 
}func (this *MyStack) Move(){    if len(this.queue1) == 0{//交换,queue1置为queue2,queue2置为空this.queue1,this.queue2 = this.queue2,this.queue1}else{//queue1元素从头开始一个一个追加到queue2中this.queue2 = append(this.queue2,this.queue1[0])  this.queue1 = this.queue1[1:]	//去除第一个元素this.Move()     //重复}
}func (this *MyStack) Pop() int {val := this.queue1[0]this.queue1 = this.queue1[1:]	//去除第一个元素return val}func (this *MyStack) Top() int {return this.queue1[0]	//直接返回
}func (this *MyStack) Empty() bool {
return len(this.queue1) == 0
}

我这一开始提交的可以直接通过,但是不是队列实现栈,哈哈...

// 我这下面的栈并不是由队列实现的?  感觉有点奇怪,直接就用了下标索引取值的很 easy
type MyStack struct {queue []int
}func Constructor() MyStack {return MyStack{queue: make([]int,0),}
}func (this *MyStack) Push(x int)  {this.queue = append(this.queue,x)
}func (this *MyStack) Pop() int {val := this.queue[len(this.queue) - 1]this.queue = this.queue[0:len(this.queue)-1]return val
}func (this *MyStack) Top() int {return this.queue[len(this.queue) - 1]
}func (this *MyStack) Empty() bool {return len(this.queue) == 0
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/307673.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KDTree索引(K近邻搜索,半径R内近邻搜索)——PCL

K近邻搜索(K Nearest Neighbors) K近邻搜索是一种基于点数量的搜索方法,它会找到指定点附近最接近的K个邻居点。K近邻搜索中的K值是一个参数,您需要指定要搜索的邻居数量。该方法适用于需要查找固定数量邻居点的情况,…

Rust腐蚀服务器常用参数设定详解

Rust腐蚀服务器常用参数设定详解 大家好我是艾西,一个做服务器租用的网络架构师上期我们分享了rust腐蚀服务器的windows系统搭建方式,其中启动服务器bat参数因为涉及的东西比较多所以想通过这篇文章给大家做一下详细的分享。 (注本文中xxxx…

安装达梦(DM8)数据库(命令符安装)

一、配置DM8数据库系统环境 在CentOS7系统环境安装DM8(达梦)数据库前的准备。(注意:安装前必须创建 dmdba 用户,禁止使用 root 用户安装数据库。) 1、新建用户 运行SecureCRT工具,root登录168…

记一次centos合并excel,word,png,pdf为一个整体pdf的入坑爬坑过程(一直显示宋体问题)。

一、背景 原先已经简单实现了excel,word,png,pdf合成一个整体pdf的过程。并将它弄到docker容器中。 1、原先入坑的技术栈 php:7.4 (业务有涉及)php第三方包 setasign\Fpdi\Fpdi : 2.3.6 (pdf合并)libreoffice : 5.3.6.1ImageMagick: 6.9.10-68 2、…

VLC-Qt实现简单的视频播放器

VLC-Qt是一个结合了Qt应用程序和libVLC的免费开源库。它提供了用于媒体播放的核心类,以及用于快速开发媒体播放器的GUI类。由于集成了整个libVLC,VLC-Qt具备了libVLC的所有特性, 例如:libVLC实例和播放器、单个文件和列表播放、音…

计算机网络——CSMA/CD协议以及相关习题

目录 前言 引言 CSMA/CD协议 CSMA与CSMA/CD的区别 CSMA/CD流程 前言 本博客是博主用于复习计算机网络的博客,如果疏忽出现错误,还望各位指正。 引言 最早的以太网,许多计算机都连接在一根总线上工作——广播通信方式。 总线的特点想…

DVWA-xss储存型及beef下载(kali)

beef下载 apt-get update apt-get install beef-xss 登录网址是 这里的ip为虚拟机的地址 之后会让你设置密码 如果密码和用户不知道在etc/beef-xss/config.yaml可以查看 这是偷cookie的就是代码 这里是可以修改的不修改的话代码是不全的 通过beef拿到了cookies之后在网页…

【自然语言处理八-transformer实现翻译任务-一(输入)】

自然语言处理八-transformer实现翻译任务-一(输入) transformer架构数据处理部分模型的输入数据(图中inputs outputs outputs_probilities对应的label)以处理英中翻译数据集为例的代码 positional encoding 位置嵌入代码 鉴于transfomer的重要性&#xf…

抖音快手直播整蛊软件插件工具合集(多啦咪/梦歌)

哪一款整蛊直播软件靠谱呢? 相信很多粉丝宝宝们,在做抖音直播或者快手的都在找好用又便宜的直播整蛊插件或者软件,但是好用的几乎少之又少,今天梦歌给大家分享几个,目前在用的也亲测过的几个软件及插件工具给大家参考&…

记录一下MySQL8版本更改密码规则

#查看当前密码策略 show variables like validate_password%;#修改密码等级为low set global validate_password.policy LOW; #注意MySQL8版本这是点,不是_#修改密码长度为6 set global validate_password.length 6;#查询我的数据库中user表host和user select host,…

基于javassm的医院挂号系统

开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclip…

大厂Java笔试题之判断字母大小写

/*** 题目:如果一个由字母组成的字符串,首字母是大写,那么就统计该字符串中大写字母的数量,并输出该字符串中所有的大写字母。否则,就输出* 该字符串不是首字母大写*/ public class Demo2 {public static void main(St…

图片批量高效缩放,批量缩放GIF图片并在缩放后以bmp位图保存

在这个数字化时代,图片已经成为我们生活和工作中不可或缺的一部分。无论是制作海报、设计网站,还是日常分享,我们都需要对图片进行处理。然而,面对大量的GIF图片,如何高效地进行缩放并转换为BMP位图,成为了…

Traefik与传统的Edge Router有何不同?

在云原生时代,传统的网络架构和现代的解决方案之间存在明显的差异。特别是在处理网络流量和路由方面,传统的 Edge Router 与像 Traefik 这样的现代反向代理和负载均衡器相比,展现出许多不同的特点。本文将深入探讨 Traefik 与传统 Edge Route…

阿里云账号注册流程,支持多种方式注册,这种方法最简单

2024年阿里云账号注册支持手机号短信验证码注册、淘宝、支付宝和钉钉注册四种方式,使用手机号注册后还需要完成实名认证,如果选择支付宝、淘宝或钉钉注册的话,可以自动调用实名认证信息,免去实名认证步骤。阿里云百科aliyunbaike.…

Tomcat启动闪退的10个解决小技巧

引言 大家好!在我们日常开发中,使用Tomcat作为Web服务器是相当常见的。 然而,遇到Tomcat启动后立即闪退的问题也不是什么稀罕事。 这种情况可能会让人感到困惑和沮丧,特别是当你急需完成一个项目或者修复一个重要的bug时。 不过…

【Java SE】多态

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 多态1.1 多态是什么1.2 多态的意义1.3 多态的实现条件 2. 重写2.1 重写的概念2.2 重写的规则2.3 重写与重…

MP4 封装格式详解

MP4 封装格式详解 MP4 封装格式详解简介概念与术语MP4 整体结构Box 结构Box HeaderBox Data MP4 典型 Boxftyp(File Type Box)moov(Movie Box)mvhd(moov header)traktkhd(track header box&…

vue3大事件项目3

弹框验证 先准备变量: const formModel ref({ cate_name: , cate_alias: }) 还有规则: const rules { cate_name: [ { required: true, message: please input name, trigger: blur }, { pattern: /^\S{1,10}$/, message: must be 1-10, trigger: blur } ], …

太阳光光照试验耐久性老化试验使用太阳光模拟器系统

上海科迎法电气科技有限公司生产的太阳光模拟器系统主要应用于太阳能研究、材料研究、光伏组件测试、空间环境模拟器、植物生长研究、光热模拟等领域,主要表现特征为: 1. 太阳能研究:可用于模拟不同光照条件下太阳能电池的性能测试和研究&am…