用栈来实现队列的golang实现
使用栈实现队列的下列操作:
- push(x) -- 将一个元素放入队列的尾部。
- pop() -- 从队列首部移除元素。
- peek() -- 返回队列首部的元素。
- empty() -- 返回队列是否为空。
MyQueue queue = new MyQueue();queue.push(1); queue.push(2); 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 maintype 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) != 0 {x := this.OutputStack[len(this.OutputStack)-1]this.OutputStack = this.OutputStack[:len(this.OutputStack)-1]return x}//如果输出栈为空,但是输入栈不为空,那就把输入栈的元素放进输出栈,并去除栈顶元素if len(this.InputStack) != 0 {for i := len(this.InputStack); i > 0; i-- {this.OutputStack = append(this.OutputStack, this.InputStack[i-1])this.InputStack = this.InputStack[:len(this.InputStack)-1]}x := this.OutputStack[len(this.OutputStack)-1]this.OutputStack = this.OutputStack[:len(this.OutputStack)-1]return x}return 0 //两个栈都是空的 }/** Get the front element. */ func (this *MyQueue) Peek() int {if len(this.OutputStack) != 0 {return this.OutputStack[len(this.OutputStack)-1]}if len(this.InputStack) != 0 {for i := len(this.InputStack); i > 0; i-- {this.OutputStack = append(this.OutputStack, this.InputStack[i-1])this.InputStack = this.InputStack[:len(this.InputStack)-1]}return this.OutputStack[len(this.OutputStack)-1]}return 0 }/** Returns whether the queue is empty. */ func (this *MyQueue) Empty() bool {if len(this.InputStack)+len(this.OutputStack) == 0 {return true}return false }func main() {queue := Constructor()queue.Push(1)queue.Push(2)_ = queue.Peek()_ = queue.Pop()_ = queue.Empty() }
转载于:https://www.cnblogs.com/TimLiuDream/p/10087768.html
用栈来实现队列的golang实现相关推荐
- 【数据结构】单调栈和单调队列 详解+例题剖析
算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...
- 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...
多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...
- 用栈来表示队列,用队列来表示栈
这个问题总的栈和队列,没有自己手写,自己手写太浪费了,于是就用的java中的集合框架list下面的LinkedList 其实LinkedList既可以当做栈用,也可以当做队列来使用. 作为栈的时候,L ...
- 【剑指offer】用两个栈实现一个队列
题目:两个栈实现一个队列. 栈的特点:先进后出,队列的特点是先进先出 思路:stack1放入数据:pop时,先判断stack2是否为空,如果不为空,直接pop,如果空,则push(stack1.pop ...
- 【C++ 语言】容器 ( queue 队列 | stack 栈 | priority_queue 优先级队列 | set 集合 | 容器遍历 | map )
文章目录 queue 队列 stack 栈 priority_queue 优先级队列 priority_queue 优先级队列指定排序方法 priority_queue 优先级队列排序行为 prior ...
- 剑指offer五:两个栈实现一个队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. package com.jianzhioffer;import java.util.Stack;publ ...
- 两个栈实现一个队列,两个队列实现一个栈
题目:用两个栈实现一个队列,用两个队列实现一个栈. 首先要了解栈和队列这两种数据结构各自的特点,栈是一种后入先出(Last In First Out,LIFO)的数据结构,队列是一种先进先出(Firs ...
- python 用两个栈实现一个队列
| 两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素 ...
- java实现-两个栈实现一个队列和两个队列实现一个栈
1.两个栈实现一个队列 思路:压入元素直接入stack1,删除元素先判断stack2中是否为空,如果不为空直接弹出:为空则将stack1中的元素取出压入 stack2中再弹出. 代码: import ...
最新文章
- java数据类型转化_JAVA基本数据类型及其转换
- 2021年2月2日 - cxFocus Directive的单元测试不够稳定,有时候findFirstFocusable会多执行一次
- C++substr()用法
- 面试官:面对业务量增长10倍、100倍怎么处理? 当场哭出声。。
- [下载]活学活用DataGrid控件与ADO.NET
- radius服务器mac_连如何抵御MAC攻击都不知道 过年还如何抵御三姑六婆的魔法攻击...
- 离散数学 习题篇 —— 集合相等与子集关系判断
- Xshell 外观配置
- 黄金分割法求极值 matlab,利用matlab实现黄金分割法求极值问题-北京理工大学-机械优化设计.doc...
- QDUOJ 93 - 分辣条(01背包)
- 计算机sci四区论文,sci四区发表论文是什么水平
- 个人面经整理深信服测开
- 餐饮服务设备行业的互联网趋势
- 基于c#的区块链编程_3.区块链 · C#区块链编程入门教程-巴比特图书
- matlab 实验七,matlab 实验七 数字填图问题
- 许久不动笔,,再来点人生感悟吧
- L2-027. 名人堂与代金券
- html 正方形符号,Html 特殊符号
- 一年经验工作了三年,拥有三年工作经验,你是哪一种?
- Improvement of AUTO sampling statistics gathering feature in Oracle 11g
热门文章
- boost::intrusive::value_traits用法的测试程序
- boost::geometry::detail::tupled_output_has用法的测试程序
- boost::fibers::numa::topology用法的测试程序
- GDCM:串联/提取DICOM文件的测试程序
- boost的chrono模块最小时间点的测试程序
- ITK:使用GMM EM进行分布式采样
- VTK:PolyData之Outline
- C++确定一个字符串是否是另一个字符串的排列的算法(附完整源码)
- QT的QVarLengthArray类的使用
- 经典C语言程序100例之八三