LeetCode 225. Implement Stack using Queues 用队列实现栈(Java)

题目:

Implement the following operations of a stack using queues.

push(x) – Push element x onto stack.
pop() – Removes the element on top of the stack.
top() – Get the top element.
empty() – Return whether the stack is empty.

Example:
MyStack stack = new MyStack();
stack.push(1);
stack.push(2);
stack.top(); // returns 2
stack.pop(); // returns 2
stack.empty(); // returns false

Notes:

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

解答:

每次 push() 通过遍历把新加入的值放在列表头部,从而可以直接实现 pop() 和 top() 功能

class MyStack {
    Queue<Integer> queue;
    
    public MyStack() {
        queue = new LinkedList<Integer>();
    }
    
    /** Push element x onto stack. */
    public void push(int x) {
        queue.add(x);
        int size=queue.size();
        while(size>1){
            queue.add(queue.poll());
            size--;
        }
    }
    
    /** Removes the element on top of the stack and returns that element. */
    public int pop() {
        return queue.poll();
    }
    
    /** Get the top element. */
    public int top() {
        return queue.peek();
    }
    
    /** Returns whether the stack is empty. */
    public boolean empty() {
        return queue.isEmpty();
    }
}

queue的常见用法
add()向队列中增加一个元索,如果队列已满,则抛出一个IIIegaISlabEepeplian 异常
offer()添加一个元素并返回true,如果队列已满,则返回false
put()添加一个元素 如果队列满,则阻塞

poll()移除并返问队列头部的元素,如果队列为空,则返回null
remove()移除并返回队列头部的元素,如果队列为空,则抛出一个NoSuchElementException异常

peek()返回队列头部的元素 如果队列为空,则返回null
element()返回队列头部的元素,如果队列为空,则抛出一个NoSuchElementException异常
take()移除并返回队列头部的元素 如果队列为空,则阻塞

offer() ,add() 区别:
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。这时新的 offer() 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。

poll() ,remove() 区别:
remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似,但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

peek() ,element() 区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

你可能感兴趣的:(LeetCode)