使用栈实现队列 Implement Queue using Stacks

问题:测试

Implement the following operations of a queue using stacks.spa

  • push(x) -- Push element x to the back of queue.
  • pop() -- Removes the element from in front of queue.
  • peek() -- Get the front element.
  • empty() -- Return whether the queue is empty.

Notes:指针

  • You must use only standard operations of a stack -- which means only push to toppeek/pop from topsize, and is emptyoperations are valid.
  • Depending on your language, stack may not be supported natively. You may simulate a stack by using a list or deque (double-ended queue), as long as you use only standard operations of a stack.
  • You may assume that all operations are valid (for example, no pop or peek operations will be called on an empty queue).

解决:code

【注】关于测试参数的解释:element

["MyQueue","push","push","peek","pop","pop","empty"] --- 表示要进行的操做it

[[],[1],[2],[],[],[],[]] --- 表示对应传入的参数io

① 使用两个栈s1,s2,进栈的时候不作任何处理,出栈的时候把栈逆序放在另一个栈,出另一个栈。
以前写常常出现空栈异常或者超时,就是没有写好s1,s2之间的转换。class

class MyQueue { // 87ms
    Stack<Integer> s1 = new Stack<>();
    Stack<Integer> s2 = new Stack<>();
    /** Initialize your data structure here. */
    public MyQueue() {}
    /** Push element x to the back of queue. */
    public void push(int x) {
        while(! s2.isEmpty()) s1.push(s2.pop());
        s1.push(x);

    }
    /** Removes the element from in front of queue and returns that element. */
    public int pop() {
        while(! s1.isEmpty()) s2.push(s1.pop());
        return s2.pop();

    }
    /** Get the front element. */
    public int peek() {
        while(! s1.isEmpty()) s2.push(s1.pop());
        return s2.peek();
    }
    /** Returns whether the queue is empty. */
    public boolean empty() {
        while(! s2.isEmpty()) s1.push(s2.pop());
        return s1.isEmpty();

    }
}
/**
 * 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();
 */object

② 使用两个栈,在进栈的时候,把栈逆序放在另一个栈,出的时候直接出另一个栈就能够了。queue

class MyQueue { //93ms
    Stack<Integer> s1 = new Stack<>();
    Stack<Integer> s2 = new Stack<>();
    /** Initialize your data structure here. */
    public MyQueue() {}
    /** Push element x to the back of queue. */
    public void push(int x) {
        while(! s1.isEmpty()) s2.push(s1.pop());
        s2.push(x);
        while(! s2.isEmpty()) s1.push(s2.pop());

    }
    /** Removes the element from in front of queue and returns that element. */
    public int pop() {
        return s1.pop();
    }
    /** Get the front element. */
    public int peek() {
        return s1.peek();
    }
    /** Returns whether the queue is empty. */
    public boolean empty() {
        return s1.isEmpty();
    }
}

③ 除了使用两个栈以外,额外使用一个指针指向头部。

class MyQueue { //113ms     Stack<Integer> s1 = new Stack<>();     Stack<Integer> s2 = new Stack<>();     int head;     /** Initialize your data structure here. */     public MyQueue() {}     /** Push element x to the back of queue. */     public void push(int x) {         if(s1.isEmpty()) head = x;         s1.push(x);     }     /** Removes the element from in front of queue and returns that element. */     public int pop() {         while(! s1.isEmpty()) s2.push(s1.pop());         int top = -1;         if(! s2.isEmpty()){             top = s2.pop();             if(! s2.isEmpty()) head = s2.peek();         }         while(! s2.isEmpty()) s1.push(s2.pop());         return top;     }     /** Get the front element. */     public int peek() {         return head;     }     /** Returns whether the queue is empty. */     public boolean empty() {         return s1.isEmpty();     } }

相关文章
相关标签/搜索