栈队列例题3:使用两个栈实现一个队列
思路:
使用两栈实现一个队列,stack1栈是用来push的,当要pop时,需要先把stack1栈的数据pop出来,用stack2栈push接收,这样就实现了反转,然后再将stack2栈中pop一下,就实现了犹如队列的出队操作。进行入栈时,再把stack2中的数据pop出来,用stack1栈push接收,然后stack1再push一下新进来的元素即可;
代码如下:
1 import java.util.Stack; 2 3 public class QueueByTwoStacks<T> { 4 private Stack<T> stack1=new Stack<T>(); //入栈时使用此栈 5 private Stack<T> stack2=new Stack<T>(); //出栈时使用此栈 6 7 public void enQueue(T element) 8 { 9 if(!stack2.isEmpty()) 10 { 11 move(stack2,stack1); 12 } 13 stack1.add(element); 14 } 15 16 public T deQueue() 17 { 18 T value; 19 if(!stack1.isEmpty()) 20 { 21 move(stack1,stack2); 22 value=stack2.pop(); 23 }else { 24 value=stack2.pop(); 25 } 26 return value; 27 } 28 // 两个栈的互相转换 29 public void move(Stack<T> stackOne,Stack<T> stackTwo) 30 { 31 while(!stackOne.isEmpty()) 32 { 33 stackTwo.push(stackOne.pop()); 34 } 35 } 36 37 }
测试代码:
1 public class Test { 2 3 public static void main(String[] args) { 4 QueueByTwoStacks<String> qts=new QueueByTwoStacks<String>(); 5 qts.enQueue("one"); 6 qts.enQueue("two"); 7 qts.enQueue("three"); 8 qts.enQueue("four"); 9 qts.enQueue("five"); 10 System.out.println(qts.deQueue()); 11 System.out.println(qts.deQueue()); 12 } 13 14 }
结果: