用两个栈实现队列

来源:互联网 发布:淘宝空包代发靠谱吗 编辑:程序博客网 时间:2024/06/12 01:39

实现队列,就要实现它的3个方法:Enqueue(入队)、Dequeue(出队)和Peek(队头)。

1stack1存的是每次进来的元素,所以Enqueue就是把进来的元素pushstack1中。

2)而对于Dequeue,一开始stack2是空的,所以我们把stack1中的元素全都popstack2中,这样stack2的栈顶就是队头。只要stack2不为空,那么每次出队,就相当于stack2pop

3)接下来,每入队一个元素,仍然pushstack1中。每出队一个元素,如果stack2不为空,就从stack2pop一个元素;如果stack2为空,就重复上面的操作——把stack1中的元素全都popstack2中。

4Peek操作,类似于Dequeue,只是不需要出队,所以我们调用stack2Peek操作。当然,如果stack2为空,就把stack1中的元素全都popstack2中。

5)注意边界的处理,如果stack2stack1都为空,才等于队列为空,此时不能进行PeekDequeue操作。

import java.util.Stack;public class Queue {private Stack<Object> stack1;private Stack<Object> stack2;public Queue(){stack1=new Stack<>();stack2=new Stack<>();} public void put(int data){if(stack1!=null){stack1.add(data);}}public int pop() throws Exception{if(stack2.size()==0){if(stack1!=null&&stack1.size()>0){while(stack1.size()!=0){stack2.add(stack1.pop());}}else{throw new Exception("null");}}return (int) stack2.pop();}/** * @param args * @throws Exception  */public static void main(String[] args) throws Exception {// TODO Auto-generated method stubQueue queue=new Queue();queue.put(1);queue.put(2);queue.put(3);System.out.println(queue.pop());System.out.println(queue.pop());System.out.println(queue.pop());System.out.println(queue.pop());}}