[232] 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(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(双端队列)来模拟一个栈,只要是标准的栈操作即可。

示例 1:

scss 复制代码
输入:
["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的值 入栈到栈2,这时栈2便是倒序了 出列的时候栈2出栈
  • 注意:需要栈2的值为空时才能入到栈2,不然会打乱队列顺序

编码实现

ts 复制代码
class MyQueue {
    /*
    思路 用两个栈维护
    当需要出栈时,把栈1的值 入栈到栈2,这时栈2便是倒序了 出列的时候栈2出栈
    注意:需要栈2的值为空时才能入到栈2,不然会打乱队列顺序
    */ 
    stack1: number[];
    stack2: number[];
    constructor(){
        this.stack1 = []
        this.stack2 = []
    }
    push(x: number): void {
        this.stack1.push(x)
    }

    pop(): number {
    // 假如 stack2 为空,需要将 stack1 的元素转移进来
        if(this.stack2.length===0){
        // 当 stack1 不为空时,出栈
            while(this.stack1.length){
                this.stack2.push(this.stack1.pop()as number)
            }
        }
        return this.stack2.pop() as number
    }

    peek(): number {
        if(this.stack2.length===0){
            while(this.stack1.length){
                this.stack2.push(this.stack1.pop()as number)
            }
        }
        return this.stack2[this.stack2.length-1]
    }

    empty(): boolean {
        return !this.stack1.length && !this.stack2.length
    }
}
相关推荐
狼性书生3 分钟前
uniapp实现的简约美观的星级评分组件
前端·uni-app·vue·组件
书语时6 分钟前
ES6 Promise 状态机
前端·javascript·es6
枫景Maple27 分钟前
LeetCode 2297. 跳跃游戏 VIII(中等)
算法·leetcode
鑫鑫向栄28 分钟前
[蓝桥杯]修改数组
数据结构·c++·算法·蓝桥杯·动态规划
鑫鑫向栄28 分钟前
[蓝桥杯]带分数
数据结构·c++·算法·职场和发展·蓝桥杯
拉不动的猪34 分钟前
管理不同权限用户的左侧菜单展示以及权限按钮的启用 / 禁用之其中一种解决方案
前端·javascript·面试
西陵1 小时前
前端框架渲染DOM的的方式你知道多少?
前端·javascript·架构
小九九的爸爸1 小时前
我是如何让AI帮我还原设计稿的
前端·人工智能·ai编程
海的诗篇_1 小时前
前端开发面试题总结-JavaScript篇(一)
开发语言·前端·javascript·学习·面试
小wanga1 小时前
【递归、搜索与回溯】专题三 穷举vs暴搜vs回溯vs剪枝
c++·算法·机器学习·剪枝