首页 > 其他分享 >LeetCode 232.用栈实现队列(简单)

LeetCode 232.用栈实现队列(简单)

时间:2022-11-25 13:35:26浏览次数:47  
标签:peek 队列 元素 pop 用栈 empty push LeetCode 232

题目描述:

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

实现 ​​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(双端队列)来模拟一个栈,只要是标准的栈操作即可。

进阶:

你能否实现每个操作均摊时间复杂度为 ​​O(1)​​​ 的队列?换句话说,执行 ​​n​​​ 个操作的总时间复杂度为 ​​O(n)​​ ,即使其中一个操作可能花费较长时间。

示例:

输入:
["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

提示:

  • ​1 <= x <= 9​
  • 最多调用 ​​100​​ 次 ​​push​​ 、 ​​pop​​ 、 ​​peek​​ 和 ​​empty​
  • 假设所有操作都是有效的 (例如,一个空的队列不会调用 ​​pop​​ 或者 ​​peek​​ 操作)

题目分析:

这道题可以使用两个栈来实现一个队列。其中一个栈用作输入栈,当有数据要进入队列时,直接把该数据压入输入栈中。另一个栈用作输出栈,当要获取队列头元素或者队列头元素要出队列时,就获取输出栈的最顶端元素或者把最顶端元素弹出。当然,每次执行获取队列头元素或者队列头元素要出队列操作前,都需要检查输出栈是否为空,如果为空,就需要把输入栈的所有元素先翻转压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。最后,判断队列是否为空的方法就是直接判断两个栈是否都为空,如果都为空就表明该队列为空。

题解:

执行用时: 0 ms

内存消耗: 36.3 MB

class MyQueue {

// 创建两个栈 一个入栈一个出栈
Stack<Integer> in, out;

public MyQueue() {
in = new Stack<>();
out = new Stack<>();
}

// 添加进队列方法
public void push(int x) {
// 直接把元素压入入栈
in.push(x);
}

// 出队列方法
public int pop() {
// 把入栈的元素翻转进出栈
inToOut();
// 获取出栈最顶端元素值
int x = out.peek();
// 把该元素弹出
out.pop();
// 返回弹出的元素值即队头值
return x;
}

// 获取队列头元素方法
public int peek() {
// 把入栈的元素翻转进出栈
inToOut();
// 返回出栈最顶端元素值
return out.peek();
}

// 判断队列是否为空方法
public boolean empty() {
// 如果入栈和出栈都为空,队列就是空的
return in.empty() && out.empty();
}

// 把入栈的元素翻转进出栈的方法
public void inToOut() {
// 如果出栈为空才进行翻转操作
// 出栈不为空,后进队列的元素直接压进入栈
// 对出栈没有任何影响
if (out.empty()) {
// 把入栈所有元素压入出栈
while (!in.empty()) {
// 获取入栈最顶端元素值
int x = in.peek();
// 把该元素弹出
in.pop();
// 把该元素压入出栈
out.push(x);
}
}
}
}

/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue obj = new MyQueue();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.peek();
* boolean param_4 = obj.empty();
*/

题目来源:力扣(LeetCode)



标签:peek,队列,元素,pop,用栈,empty,push,LeetCode,232
From: https://blog.51cto.com/u_15891283/5886568

相关文章

  • LeetCode 448.找到所有数组中消失的数字(简单)
    题目描述:给你一个含​​n​​​个整数的数组​​nums​​​,其中​​nums[i]​​​在区间​​[1,n]​​​内。请你找出所有在​​[1,n]​​​范围内但没有出现......
  • LeetCode 48.旋转图像(中等)
    题目描述:给定一个​​n × n​​​的二维矩阵 ​​matrix​​​表示一个图像。请你将图像顺时针旋转​​90​​度。你必须在原地旋转图像,这意味着你需要直接修改......
  • LeetCode 260.只出现一次的数字III(中等)
    题目描述:给定一个整数数组​​nums​​,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。进阶:你的算法......
  • LeetCode 476.数字的补数(简单)
    题目描述:给你一个正整数​​num​​,输出它的补数。补数是对该数的二进制表示取反。示例1:输入:num=5输出:2解释:5的二进制表示为101(没有前导零位),其补数为010。所以......
  • LeetCode 693.交替位二进制数(简单)
    题目描述:给定一个正整数,检查它的二进制表示是否总是0、1交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。示例1:输入:n=5输出:true解释:5的二进制表示是:101示......
  • LeetCode 268.丢失的数字(简单)
    题目描述:给定一个包含​​[0,n]​​​中​​n​​​个数的数组​​nums​​​,找出​​[0,n]​​这个范围内没有出现在数组中的那个数。进阶:你能否实现线性时间......
  • LeetCode 338.比特位计数(简单)
    题目描述:给你一个整数​​n​​​,对于​​0<=i<=n​​​中的每个​​i​​​,计算其二进制表示中​​1​​​的个数,返回一个长度为​​n+1​​​的数组​......
  • LeetCode 540.有序数组中的单一元素
    LeetCode540.有序数组中的单一元素题目链接:​​https://leetcode-cn.com/problems/single-element-in-a-sorted-array/​​题目描述:给定一个只包含整数的有序数组,每个元......
  • LeetCode 154.寻找旋转排序数组中的最小值II
    LeetCode154.寻找旋转排序数组中的最小值II题目链接:​​https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/​​题目描述:已知一个长度为 n ......
  • LeetCode 81.搜索旋转排序数组II
    LeetCode81.搜索旋转排序数组II题目链接:​​https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/​​题目描述:已知存在一个按非降序排列的整数数组 n......