使用栈实现队列的下列操作:

  • 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. 【数据结构】单调栈和单调队列 详解+例题剖析

    算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...

  2. 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...

    多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...

  3. 用栈来表示队列,用队列来表示栈

    这个问题总的栈和队列,没有自己手写,自己手写太浪费了,于是就用的java中的集合框架list下面的LinkedList 其实LinkedList既可以当做栈用,也可以当做队列来使用. 作为栈的时候,L ...

  4. 【剑指offer】用两个栈实现一个队列

    题目:两个栈实现一个队列. 栈的特点:先进后出,队列的特点是先进先出 思路:stack1放入数据:pop时,先判断stack2是否为空,如果不为空,直接pop,如果空,则push(stack1.pop ...

  5. 【C++ 语言】容器 ( queue 队列 | stack 栈 | priority_queue 优先级队列 | set 集合 | 容器遍历 | map )

    文章目录 queue 队列 stack 栈 priority_queue 优先级队列 priority_queue 优先级队列指定排序方法 priority_queue 优先级队列排序行为 prior ...

  6. 剑指offer五:两个栈实现一个队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. package com.jianzhioffer;import java.util.Stack;publ ...

  7. 两个栈实现一个队列,两个队列实现一个栈

    题目:用两个栈实现一个队列,用两个队列实现一个栈. 首先要了解栈和队列这两种数据结构各自的特点,栈是一种后入先出(Last In First Out,LIFO)的数据结构,队列是一种先进先出(Firs ...

  8. python 用两个栈实现一个队列

    | 两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素 ...

  9. java实现-两个栈实现一个队列和两个队列实现一个栈

    1.两个栈实现一个队列 思路:压入元素直接入stack1,删除元素先判断stack2中是否为空,如果不为空直接弹出:为空则将stack1中的元素取出压入 stack2中再弹出. 代码: import ...

最新文章

  1. java数据类型转化_JAVA基本数据类型及其转换
  2. 2021年2月2日 - cxFocus Directive的单元测试不够稳定,有时候findFirstFocusable会多执行一次
  3. C++substr()用法
  4. 面试官:面对业务量增长10倍、100倍怎么处理? 当场哭出声。。
  5. [下载]活学活用DataGrid控件与ADO.NET
  6. radius服务器mac_连如何抵御MAC攻击都不知道 过年还如何抵御三姑六婆的魔法攻击...
  7. 离散数学 习题篇 —— 集合相等与子集关系判断
  8. Xshell 外观配置
  9. 黄金分割法求极值 matlab,利用matlab实现黄金分割法求极值问题-北京理工大学-机械优化设计.doc...
  10. QDUOJ 93 - 分辣条(01背包)
  11. 计算机sci四区论文,sci四区发表论文是什么水平
  12. 个人面经整理深信服测开
  13. 餐饮服务设备行业的互联网趋势
  14. 基于c#的区块链编程_3.区块链 · C#区块链编程入门教程-巴比特图书
  15. matlab 实验七,matlab 实验七 数字填图问题
  16. 许久不动笔,,再来点人生感悟吧
  17. L2-027. 名人堂与代金券
  18. html 正方形符号,Html 特殊符号
  19. 一年经验工作了三年,拥有三年工作经验,你是哪一种?
  20. Improvement of AUTO sampling statistics gathering feature in Oracle 11g

热门文章

  1. boost::intrusive::value_traits用法的测试程序
  2. boost::geometry::detail::tupled_output_has用法的测试程序
  3. boost::fibers::numa::topology用法的测试程序
  4. GDCM:串联/提取DICOM文件的测试程序
  5. boost的chrono模块最小时间点的测试程序
  6. ITK:使用GMM EM进行分布式采样
  7. VTK:PolyData之Outline
  8. C++确定一个字符串是否是另一个字符串的排列的算法(附完整源码)
  9. QT的QVarLengthArray类的使用
  10. 经典C语言程序100例之八三