• [LeetCode] 232. Implement Queue using Stacks


    用栈模拟队列。同理参考影子题225题

    题干即是题意,用栈实现队列的几个函数,例子,

    Example:

    MyQueue queue = new MyQueue();
    
    queue.push(1);
    queue.push(2);  
    queue.peek();  // returns 1
    queue.pop();   // returns 1
    queue.empty(); // returns false

    思路是需要用到两个栈,用first和second表示。以下分别解释一下每个函数的实现方式。

    push() - 将元素加入队列。这没什么可说的,加入到第一个栈first中。时间O(1)

    pop() - 弹出队列的首个元素。因为stack只会弹出最后一个放入的元素,所以只能通过将第一个stack中的元素全部倒入第二个stack中,再pop的方式,得到queue的首个元素。时间O(n)

    peek() - 看一下队列顶端的元素。因为peek的功能几乎跟pop无异,只是pop会弹出首个元素,peek只是看一下,所以做法跟pop几乎相同,也是需要将所有元素都倒入第二个stack中再peek第二个stack的顶端。时间O(1)

    empty() - 检测队列是否为空。只要看一下两个stack是否都为空即可。时间O(1)

    最后分享一个B站非常好的视频讲解,https://www.bilibili.com/video/av86054613/

    时间 - 参考以上

    空间O(n) - 用到两个stack

    JavaScript实现

     1 /**
     2  * Initialize your data structure here.
     3  */
     4 var MyQueue = function () {
     5     this.first = [];
     6     this.second = [];
     7 };
     8 
     9 /**
    10  * Push element x to the back of queue. 
    11  * @param {number} x
    12  * @return {void}
    13  */
    14 MyQueue.prototype.push = function (x) {
    15     this.first.push(x);
    16 };
    17 
    18 /**
    19  * Removes the element from in front of queue and returns that element.
    20  * @return {number}
    21  */
    22 MyQueue.prototype.pop = function () {
    23     // if the second stack is empty, move everything from first to second
    24     if (!this.second.length) {
    25         while (this.first.length) {
    26             this.second.push(this.first.pop());
    27         }
    28     }
    29     return this.second.pop();
    30 };
    31 
    32 /**
    33  * Get the front element.
    34  * @return {number}
    35  */
    36 MyQueue.prototype.peek = function () {
    37     // almost same as pop()
    38     if (!this.second.length) {
    39         while (this.first.length) {
    40             this.second.push(this.first.pop());
    41         }
    42     }
    43     return this.second[this.second.length - 1];
    44 };
    45 
    46 /**
    47  * Returns whether the queue is empty.
    48  * @return {boolean}
    49  */
    50 MyQueue.prototype.empty = function () {
    51     return !this.first.length && !this.second.length;
    52 };
    53 
    54 /**
    55  * Your MyQueue object will be instantiated and called as such:
    56  * var obj = new MyQueue()
    57  * obj.push(x)
    58  * var param_2 = obj.pop()
    59  * var param_3 = obj.peek()
    60  * var param_4 = obj.empty()
    61  */

    Java实现

     1 class MyQueue {
     2     Stack<Integer> s1;
     3     Stack<Integer> s2;
     4 
     5     /** Initialize your data structure here. */
     6     public MyQueue() {
     7         s1 = new Stack<>();
     8         s2 = new Stack<>();
     9     }
    10 
    11     /** Push element x to the back of queue. */
    12     public void push(int x) {
    13         s1.push(x);
    14     }
    15 
    16     /** Removes the element from in front of queue and returns that element. */
    17     public int pop() {
    18         if (!s2.isEmpty()) {
    19             return s2.pop();
    20         } else {
    21             while (!s1.isEmpty()) {
    22                 s2.push(s1.pop());
    23             }
    24             return s2.pop();
    25         }
    26     }
    27 
    28     /** Get the front element. */
    29     public int peek() {
    30         if (!s2.isEmpty()) {
    31             return s2.peek();
    32         } else {
    33             while (!s1.isEmpty()) {
    34                 s2.push(s1.pop());
    35             }
    36             return s2.peek();
    37         }
    38     }
    39 
    40     /** Returns whether the queue is empty. */
    41     public boolean empty() {
    42         return s1.isEmpty() && s2.isEmpty();
    43     }
    44 }
    45 
    46 /**
    47  * Your MyQueue object will be instantiated and called as such:
    48  * MyQueue obj = new MyQueue();
    49  * obj.push(x);
    50  * int param_2 = obj.pop();
    51  * int param_3 = obj.peek();
    52  * boolean param_4 = obj.empty();
    53  */

    LeetCode 题目总结

  • 相关阅读:
    一种循环方式
    SqlServer循环读取配置
    app抓包
    c# 前端写代码的情况
    第36月第27日 codesign重签名
    第36月第26天 吴恩达 目标检测
    第36月第25天 TensorFlow Object_detection
    第36月第19天 多个tomcat查端口
    第36月第8天 flask_bootstrap
    第36月第5天 升级到 XCode10.3 项目中的xib报错
  • 原文地址:https://www.cnblogs.com/cnoodle/p/12406589.html
Copyright © 2020-2023  润新知