zoukankan      html  css  js  c++  java
  • 如何使用栈模拟一个队列

    队列先进先出。

    栈先进后出。

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

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

    当队列有数据要入队时,我们同时将这个数据入栈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. * @param element 入队的元素

    6. */

    7. public void enQueue(int element) {

    8. stackA.push(element);

    9. }

    10. /**

    11. * 出队操作

    12. */

    13. public Integer deQueue() {

    14. if(stackB.isEmpty()){

    15. if(stackA.isEmpty()){

    16. return null;

    17. }

    18. transfer();

    19. }

    20. return stackB.pop();

    21. }

    22. ``

    23. ``

    24. /**

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

    26. */

    27. private void transfer(){

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

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

    30. }

    31. }

    32. ``

    33. ``

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

    35. StackQueue stackQueue = new StackQueue();

    36. stackQueue.enQueue(1);

    37. stackQueue.enQueue(2);

    38. stackQueue.enQueue(3);

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

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

    41. stackQueue.enQueue(4);

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

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

    44. }

  • 相关阅读:
    机器人
    昨天拿钥匙了
    Linux挂NTFS格式USB硬盘
    漫游在首都
    RHEL+WAS6部署风波
    移动电话国内漫游通话费上限评估用户意见网上调查
    WebSphere fixes
    我太强悍了
    NO SUBJECT
    pku3617 Best Cow Line
  • 原文地址:https://www.cnblogs.com/easilyai/p/9834027.html
Copyright © 2011-2022 走看看