LeetCode 0232.用栈实现队列【Go】

简介: LeetCode 0232.用栈实现队列【Go】

用栈实现队列

LeetCode232. 用栈实现队列

题目描述

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

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

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

提示:

  • 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)

示例 1:

输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

解释:

MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

思路

题目要求

  • 用两个栈实现队列,且该队列类具有四个方法,分别是入队、出队、返回队头、判断队空

队列是先进先出,栈是先进后出。可以使用两个栈,一个输入栈,一个输出栈。

入队就是向输入栈压入元素;出队就是从输出栈弹出元素;队头即输出栈栈顶元素;输出栈和输入栈都为空即队空。

注意

  • 出队:若输出栈非空,则直接弹出栈顶元素;若输出栈为空,则将输入栈全部元素移入输出栈,然后弹出栈顶元素。
  • 在Go语言中用切片模拟栈和队列

代码

Go

package main
// MyQueue 队列类
type MyQueue struct {
  stackIn  []int
  stackOut []int
}
// Constructor 队列类的构造方法
func Constructor() MyQueue {
  stackIn := make([]int, 0)
  stackOut := make([]int, 0)
  return MyQueue{stackIn, stackOut}
}
// Push 入队
func (this *MyQueue) Push(x int) {
  // 向输入栈添加元素
  this.stackIn = append(this.stackIn, x)
}
// Pop 出队
func (this *MyQueue) Pop() int {
  result := 0
  // 输出栈为空,将输入栈全部元素移到输出栈
  if len(this.stackOut) == 0 {
    for len(this.stackIn) != 0 {
      // 取出输入栈栈顶元素
      temp := this.stackIn[len(this.stackIn)-1]
      this.stackIn = this.stackIn[:len(this.stackIn)-1]
      // 将从输入栈取出的元素放入输出栈
      this.stackOut = append(this.stackOut, temp)
    }
  }
  // 取出输出栈栈顶元素
  result = this.stackOut[len(this.stackOut)-1]
  this.stackOut = this.stackOut[:len(this.stackOut)-1]
  return result
}
// Peek 返回队列头元素
func (this *MyQueue) Peek() int {
  result := 0
  // 输出栈为空,将输入栈全部元素移到输出栈
  if len(this.stackOut) == 0 {
    for len(this.stackIn) != 0 {
      // 取出输入栈栈顶元素
      temp := this.stackIn[len(this.stackIn)-1]
      this.stackIn = this.stackIn[:len(this.stackIn)-1]
      // 将从输入栈取出的元素放入输出栈
      this.stackOut = append(this.stackOut, temp)
    }
  }
  // 得到输出栈栈顶元素
  result = this.stackOut[len(this.stackOut)-1]
  return result
}
// Empty 判断队空
func (this *MyQueue) Empty() bool {
  if len(this.stackIn) == 0 && len(this.stackOut) == 0 {
    return true
  }
  return false
}

Link

GitHub

目录
相关文章
|
2月前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
70 13
|
3月前
【LeetCode 24】225.用队列实现栈
【LeetCode 24】225.用队列实现栈
16 0
|
3月前
|
算法
【LeetCode 23】232.用栈实现队列
【LeetCode 23】232.用栈实现队列
26 0
|
5月前
|
存储 算法 Go
在Go中理解栈和先进先出原则
在Go中理解栈和先进先出原则
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
35 4
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 09. 用两个栈实现队列
使用两个栈实现队列的Python解决方案,包括初始化两个栈、实现在队列尾部添加整数的appendTail方法和在队列头部删除整数的deleteHead方法,以及相应的示例操作。
42 2
|
5月前
|
Python
【Leetcode刷题Python】641.循环双端队列
文章介绍了如何实现一个循环双端队列,包括其操作如插入、删除、获取队首和队尾元素,以及检查队列是否为空或已满,并提供了Python语言的实现代码。
27 0
|
4月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
64 6
|
5月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
130 2