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

  • 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. Hard commits, soft commits and transaction logs
  2. 关于计算机英语手抄报全国一等奖,英语手抄报:Walking to School
  3. 人脸登陆facelogin
  4. Windows phone 应用开发[14]-调用WebBrowser
  5. 七月工作笔记 7.7 - 7.11
  6. HTTP与Tcp协议下双工通信的差异
  7. 新概念51单片机C语言教程纠错(3)
  8. 部署Symantec Antivirus 10.0网络防毒服务器之三
  9. UPDATE语句更新的顺序
  10. 通信upf是什么意思_中兴通讯全场景UPF 极简设计,随需而动
  11. PDF转CAD怎么弄?推荐两个转换方法
  12. 学生用计算机的感叹号在哪,感叹号怎么打电脑(感叹号的用法及举例)
  13. 企业数字化最核心的数据智能,它的价值到底在哪?
  14. 《策略投资》第1、2章读书分享
  15. 青少年的音乐合成器原理指南
  16. dubbo核心源码流程分析
  17. java打包并下载压缩包报错问题
  18. 计算机密码学学习笔记(二)——Shannon理论
  19. RxJava-Introduction
  20. 软考各级别各科目考试分析

热门文章

  1. GDCM:处理(各种操作处理)DICOM图像文件的测试程序
  2. Boost:BOOST_VERIFY的用法测试程序
  3. DCMTK:创建大型(> 4 GB)增强型CT对象的测试
  4. VTK:Rendering之MotionBlur
  5. VTK:PolyData之ExtractSelectionOriginalId
  6. VTK:图片之PickPixel2
  7. OpenCV使用不同的决策树decision trees的实例(附完整代码)
  8. Qmake建立常见的项目类型
  9. OpenGL基于PBR的irradiance辐照度的实例
  10. OpenGL material light材质灯光的实例