Implement Stack using Queues

Implement Stack using Queues

问题:

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.

思路:

  使用两个队列来回交替的来pop

我的代码:

class MyStack {

    Queue<Integer> one = new LinkedList<Integer>();

    Queue<Integer> two = new LinkedList<Integer>();

    public void push(int x) {

        if(one.isEmpty())

            two.offer(x);

        else

            one.offer(x);

    }



    // Removes the element on top of the stack.

    public void pop() {

        if(one.isEmpty())

        {

            while(two.size() != 1)

                one.offer(two.poll());

            two.poll();

        }

        else

        {

            while(one.size() != 1)

                two.offer(one.poll());

            one.poll();

        }

    }

    // Get the top element.

    public int top() {

        if(one.isEmpty())

        {

            while(two.size() != 1)

                one.offer(two.poll());

            int last = two.poll();

            one.offer(last);

            return last;

        }

        else

        {

            while(one.size() != 1)

                two.offer(one.poll());

            int last = one.poll();

            two.offer(last);

            return last;

        }

    }



    // Return whether the stack is empty.

    public boolean empty() {

        return one.isEmpty() && two.isEmpty();

    }

}
View Code

他人代码:

class MyStack {

    Queue<Integer> q = new LinkedList<Integer>();



    // Push element x onto stack.

    public void push(int x) {

        q.add(x);

    }



    // Removes the element on top of the stack.

    public void pop() {

        int size = q.size();

        for(int i = 1; i < size; i++)

            q.add(q.remove());

        q.remove();

    }



    // Get the top element.

    public int top() {

        int size = q.size();

        for(int i = 1; i < size; i++)

            q.add(q.remove());

        int ret = q.remove();

        q.add(ret);

        return ret;

    }



    // Return whether the stack is empty.

    public boolean empty() {

        return q.isEmpty();        

    }

}
View Code

学习之处:

  • 别人用了一个队列就解决了问题,我用了两个队列,浪费了空间,别人代码的精华之处在于for(int i = 1; i < size; i++) q.add(q.remove());通过size,重新将队尾的元素拿出来加到后面。

你可能感兴趣的:(Queue)