如何使用栈模拟一个队列

队列先进先出。

栈先进后出。

最近看到一道面试题,要求用两个栈模拟一个队列,这个问题在一年前遇到过,记录一下。

使用栈模拟队列,一个肯定不行,首先想到用两个栈来模拟队列。

当队列有数据要入队时,我们同时将这个数据入栈A

此时我们认为,第一次向队列中插入数据完成了。则我们将A中的数据弹出,使用B来接收这些值。

就这样将A中的元素全部弹出并且压进B中,这时就会发现,他们顺序逆转,并且如同队列一样,先进的元素到了栈顶,可以先出。

我们让1出队之后,此时我们还想继续向队列中添加数据。

 

 

此时,2依然是栈B放在栈顶的元素。此时有新的元素加入,我们依然采取刚才的方法,在新数据入队时,插入数据到栈A中。

 插入栈A之后,我们可以对栈B进行判断,如果栈B中还存有元素,则这名刚才添加的元素尚未全部出队,他们仍然遵守先进先出的原则。

当栈B中的元素全部弹出之后,我们就可以将栈A中的元素再次弹出并压进栈B,此时又实现了先进先出。

代码实现:

  1. private Stack<Integer> stackA = new Stack<Integer>();

  2. private Stack<Integer> stackB = new Stack<Integer>();

  3.  

  4. /**

  5. * 入队操作

  6. * @param element 入队的元素

  7. */

  8. public void enQueue(int element) {

  9. stackA.push(element);

  10. }

  11.  

  12. /**

  13. * 出队操作

  14. */

  15. public Integer deQueue() {

  16. if(stackB.isEmpty()){

  17. if(stackA.isEmpty()){

  18. return null;

  19. }

  20. transfer();

  21. }

  22. return stackB.pop();

  23. }

  24. ``

  25. ``

  26. /**

  27. * 栈A元素转移到栈B

  28. */

  29. private void transfer(){

  30. while (!stackA.isEmpty()){

  31. stackB.push(stackA.pop());

  32. }

  33. }

  34. ``

  35. ``

  36. public static void main(String[] args) throws Exception {

  37. StackQueue stackQueue = new StackQueue();

  38. stackQueue.enQueue(1);

  39. stackQueue.enQueue(2);

  40. stackQueue.enQueue(3);

  41. System.out.println(stackQueue.deQueue());

  42. System.out.println(stackQueue.deQueue());

  43. stackQueue.enQueue(4);

  44. System.out.println(stackQueue.deQueue());

  45. System.out.println(stackQueue.deQueue());

  46. }

posted @ 2018-10-23 00:24  EasilyAi  阅读(4139)  评论(0编辑  收藏  举报