用栈来实现队列的golang实现
使用栈实现队列的下列操作:
- push(x) -- 将一个元素放入队列的尾部。
- pop() -- 从队列首部移除元素。
- peek() -- 返回队列首部的元素。
- empty() -- 返回队列是否为空。
MyQueue queue = new MyQueue(); queue.push();
queue.push();
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
说明:
- 你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
- 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
- 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。
栈的思想是先进后出,那我们怎么实现利用栈来实现先进先出的队列呢?
我们先来看张图

进入队列的顺序为1》2》3,那我们就把这三个元素放进input栈中,再把input栈中的元素放进output栈里,那么我们可以看见,我们从output读取的数据就是1》2》3了
那么我们一个一个方法来看:
push:对于push方法,我们只需要把元素放进input栈中即可
pop:对于pop方法,我们要从output栈中获取栈顶元素,如果output栈中为空,那么我们就要从input栈中把元素都放进output栈中,再从output栈中取出栈顶元素即可,如果两个栈都是空的,那就啥事都不干
peek:对于peek方法,与pop方法基本是一样,只是读取而已,不用去除元素
empty:只需要判断input栈和output栈的容量合起来是不是不为空即可
核心代码:
package main
type MyQueue struct {
InputStack []int //输入栈
OutputStack []int //输出栈
}
/** Initialize your data structure here. */
func Constructor() MyQueue {
queue := MyQueue{[]int{}, []int{}}
return queue
}
/** Push element x to the back of queue. */
func (this *MyQueue) Push(x int) {
this.InputStack = append(this.InputStack, x)
}
/** Removes the element from in front of queue and returns that element. */
func (this *MyQueue) Pop() int {
//当输出栈不为空的,那就直接取出输出栈顶元素
if len(this.OutputStack) != {
x := this.OutputStack[len(this.OutputStack)-]
this.OutputStack = this.OutputStack[:len(this.OutputStack)-]
return x
}
//如果输出栈为空,但是输入栈不为空,那就把输入栈的元素放进输出栈,并去除栈顶元素
if len(this.InputStack) != {
for i := len(this.InputStack); i > ; i-- {
this.OutputStack = append(this.OutputStack, this.InputStack[i-])
this.InputStack = this.InputStack[:len(this.InputStack)-]
}
x := this.OutputStack[len(this.OutputStack)-]
this.OutputStack = this.OutputStack[:len(this.OutputStack)-]
return x
}
return //两个栈都是空的
}
/** Get the front element. */
func (this *MyQueue) Peek() int {
if len(this.OutputStack) != {
return this.OutputStack[len(this.OutputStack)-]
}
if len(this.InputStack) != {
for i := len(this.InputStack); i > ; i-- {
this.OutputStack = append(this.OutputStack, this.InputStack[i-])
this.InputStack = this.InputStack[:len(this.InputStack)-]
}
return this.OutputStack[len(this.OutputStack)-]
}
return
}
/** Returns whether the queue is empty. */
func (this *MyQueue) Empty() bool {
if len(this.InputStack)+len(this.OutputStack) == {
return true
}
return false
}
func main() {
queue := Constructor()
queue.Push()
queue.Push()
_ = queue.Peek()
_ = queue.Pop()
_ = queue.Empty()
}
用栈来实现队列的golang实现的更多相关文章
- [LeetCode] Implement Queue using Stacks 用栈来实现队列
Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...
- [CareerCup] 3.5 Implement Queue using Two Stacks 使用两个栈来实现队列
3.5 Implement a MyQueue class which implements a queue using two stacks. LeetCode上的原题,请参见我之前的博客Imple ...
- 两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。
一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空,则将A栈内容出栈并压人B栈,再出 B栈:不为空就直接出栈: 二.代 ...
- Python两个栈实现一个队列
牛客网原题: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 实现这个算法的方式有很多种,这里就写一种比较简单易懂的:虽然可能算法和效率上不太出色,当大多数人 ...
- 2018.9.5 Java中使用栈来模拟队列
栈的规律是是先进后出 队列的规律是先进先出 栈模拟队列 首先我们定义两个栈,一个放数据,一个出数据,判断B栈是否有元素,有元素则直接pop:没有元素则需要我们将A里面的元素出栈然后放到B里面,再取出, ...
- STL学习笔记6 -- 栈stack 、队列queue 和优先级priority_queue 三者比较
栈stack .队列queue 和优先级priority_queue 三者比较 默认下stack 和queue 基于deque 容器实现,priority_queue 则基于vector 容器实现 ...
- web前端面试系列 - 数据结构(两个栈模拟一个队列)
一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将 ...
- 232 Implement Queue using Stacks 用栈来实现队列
使用栈来实现队列的如下操作: push(x) -- 将一个元素放入队列的尾部.pop() -- 从队列首部移除元素.peek() -- 返回队列首部的元素.empty() -- 返回队列是否为空.注意 ...
- php数组函数(分类基本数组函数,栈函数,队列)
php数组函数(分类基本数组函数,栈函数,队列函数) 一.总结 1.常用数组函数 函数 描述 array() 创建数组. array_combine() 通过合并两个数组来创建一个新数组. array ...
随机推荐
- iOS-CoreData详解与使用
上面已经说完了SQLite和FMDB以及两者的区别,本篇将讲述iOS中另一个存储方式,CoreData的使用.通读下来大约10分钟,后续还会根据项目中问题,不断更新. 一.预备知识 在了解CoreDa ...
- [转]Xcode编译生成ipa文件(因为两种证书所以打两个ipa)
本文转自:https://blog.csdn.net/aisemi/article/details/78305795 1.生成Archive文档a) 需将左上角红色方框里的设备类型选为ios devi ...
- openjudge------ 日期的种类题目
描述TXT is a vegetable chicken,so 出题什么的完全不会啊! 干脆直接从网络上copy一题下来吧. 小明正在整理一批历史文献.这些历史文献中出现了很多日期.小明知道这些日期都 ...
- Spring Boot从入门到精通之:一、Spring Boot简介及快速入门
Spring Boot Spring Boot 简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来 ...
- 用Python实现Zabbix-API 监控
做运维的朋友应该知道,公司IDC机房经常有上架.下架.报修和报废的服务器.如果服务器数量很多的时候很容易造成监控遗漏. 大的互联网公司把监控系统和CMDB(资产管理系统|配置管理数据库系统 ...
- call,apply,bind的用法与区别
1.call/apply/bind方法的来源 首先,在使用call,apply,bind方法时,我们有必要知道这三个方法究竟是来自哪里?为什么可以使用的到这三个方法? call,apply,bind这 ...
- Ehcache配置详解及CacheManager使用
<?xml version="1.0" encoding="UTF-8"?><ehcache xmlns:xsi="http://w ...
- iphone怎么投屏到电脑屏幕上
随着苹果手机的更显换代,苹果手机的功能越来越强大,其中iphone手机更新了airplay镜像功能,所以想要手机投屏电脑的小伙伴就更加方便了,但是iphone怎么投屏到电脑呢?大家不用着急,下面即将为 ...
- Spring学习之旅(二)极速创建Spring框架java Web工程项目
编译工具:eclipse 1)创建Web工程:spring_web_helloworld 2)导入所需jar包: 3)创建实体类:同上篇博文 4)创建配置文件hellobean.xml.同上篇博文 不 ...
- 自动化测试 接口自动化及UI自动化测试平台设计演示
接口自动化及UI自动化测试平台设计演示 by:授客 QQ:1033553122 欢迎加入全国软件测试交流qq群:7156436 大家好,我是授客. 本视频意在分享个人,基于Python,Djan ...