18_225. 用队列实现栈


题目描述:

解题思路:

  • 用两个队列:一个用来当做栈,一个用来当做辅助队列,队列用来维持当做栈的那个原有的顺序,因此可以先把当前元素进入到辅助队列、然后把栈那个元素按顺序取出来放到辅助队列,这样辅助队列就成了新的栈,交换两个队列即可。
  • 一个队列:在入栈之前,先记录此时栈中元素的个数n,然后将当前元素入队列,再依次把n个元素取出来,依次放到队列尾即可。

代码:

两个队列
//两个队列:
class MyStack {

    Queue queue1;
    Queue queue2;
    public MyStack() {
        queue1 = new LinkedList();//当作栈,队头当做栈顶
        queue2 = new LinkedList();//辅助队列,用来维持栈中元素,现有的顺序
    }
    
    public void push(int x) {
        queue2.offer(x);
        while (!queue1.isEmpty()) {
            queue2.offer(queue1.poll());
        }
        Queue temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }
    
    public int pop() {
        return queue1.poll();

    }
    
    public int top() {
        return queue1.peek();
    }
    
    public boolean empty() {
        return queue1.isEmpty();
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */
一个队列
//一个队列:
class MyStack {
    //队列,可以维持元素的顺序
    Queue queue;//使用一个队列当做栈,记录在push之前元素的个数n,在push之后,依次取出该队列中的n个元素,然后依次添加到队列尾
    
    public MyStack() {
        queue = new LinkedList();//当作栈,队头当做栈顶
    }
    
    public void push(int x) {
        int size = queue.size();
        queue.offer(x);
        for (int i = 0; i < size; i++) {
            queue.offer(queue.poll());
        }
    }
    
    public int pop() {
        return queue.poll();

    }
    
    public int top() {
        return queue.peek();
    }
    
    public boolean empty() {
        return queue.isEmpty();
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */