60. Implement Queue using Stacks

Implement the following operations of a queue using stacks.

  • 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

栈的特点是先进后出,队列的特点是先进先出。现在有两个栈分别是stack1和stack2来组合实现队列的操作。我把stac1称作主栈,stack2称作辅栈。

       经分析可知:对于入队列操作,相等于是往stack1进行入栈操作;对于出队列的操作,需要返回的元素就是Stack2的栈顶元素,如果stack2中为空,则把stack1中的元素全部依次弹栈再入Stack2。

push(x)  入队列操作,相等于是往stack1进行入栈操作;

pop()  出队列的操作,需要删除的元素就是Stack2的栈顶元素,如果stack2中为空,则把stack1中的元素全部依次弹栈再入Stack2。

peek() 返回队头元素,需要返回的元素就是Stack2的栈顶元素,如果stack2中为空,则把stack1中的元素全部依次弹栈再入Stack2。

empty() 判断队列是否为空,两个栈同时为空时则返回true,否则返回false。

class MyQueue {
      Stack<Integer> stack1 = new Stack<Integer>();//作为入队列的栈,每次入队列的时候把元素压入这个栈内即可
      Stack<Integer> stack2 = new Stack<Integer>();//弹出队列的元素,永远是stack2的栈顶元素,如果stack2为空,则把stack1的所有元素依次弹出然后放到stack2中再弹出stack2的栈顶元素
    
    /*
     * 直接往stack1压入元素 
     */
    public void push(int node) {
        stack1.push(node);
    }
    /*
     * 弹出stack2的栈顶元素。 
     * 如果stack2为空,则把stack1的所有元素依次弹出然后放到stack2中再弹出stack2的栈顶元素
     */
    public void pop() {
    	if(stack2.isEmpty()){
    		while(!stack1.isEmpty()){
    			int node = stack1.pop();
    			stack2.add(node);
    		}
    	}
       stack2.pop();
    }
    
    // Get the front element.
    public int peek() {
        if(stack2.isEmpty()){
    		while(!stack1.isEmpty()){
    			int node = stack1.pop();
    			stack2.add(node);
    		}
    	}
        return stack2.peek();
    }

    // Return whether the queue is empty.
    public boolean empty() {
        return stack1.isEmpty() && stack2.isEmpty();
    }
}

你可能感兴趣的:(60. Implement Queue using Stacks)