经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
如何用栈实现队列
来源:cnblogs  作者:sunyk  时间:2018/11/8 9:56:37  对本文有异议

about 算法

项目介绍

工作之余,代码敲多了,停下来思考思考,会有异常不到的收获。。。只为更好的自己

如何用栈实现队列?

提示下:用一个栈肯定是没办法实现队列,但如果我们有两个栈呢?

分析:栈和队列的特性
  • 栈是先进后出,FILO

    出入元素都是在同一端(栈顶)

    入栈

     

    输入图片说明
    1540432924606.png

     

    出栈

     

    输入图片说明
    1540432988027.png

     

  • 队列是先进先出,FIFO

  • 出入元素是在不同的两端(队头和队尾)

入栈

 

输入图片说明
1540433080831.png

 

出栈

 

输入图片说明
1540433109205.png

 

思考:组装

让一个栈作为队列的入口,负责插入新元素;另外一个栈作为队列的出口,负责移除老元素。

如图所示

 

输入图片说明
1540433258745.png

 

让栈A中的所有元素按顺序出栈,再按照出栈顺序压入栈B。

这样一来,元素从栈A弹出并压入栈B的顺序是3,2,1和当初进入栈A的顺序123是相反的,如图

 

输入图片说明
1540433561742.png

 


 

输入图片说明
1540433605060.png

 

此时让元素1 “出队”,也就是让元素1从栈B弹出

 

输入图片说明
1540433651738.png

 

代码实现:

  1. /**
  2. * @author sunyang
  3. * @date 2018/10/25 10:18
  4. */
  5. public class StackImplQueue {
  6. /**
  7. * 定义两个栈来实现队列
  8. * 栈A 负责插入新元素
  9. * 栈B 负责移除老元素
  10. */
  11. private Stack<Integer> stackA = new Stack<>();
  12. private Stack<Integer> stackB = new Stack<>();
  13. /**
  14. * 入队操作
  15. * @Param element
  16. */
  17. public void enQueue(int element){
  18. stackA.push(element);
  19. }
  20. /**
  21. *
  22. * 出队操作
  23. */
  24. public Integer deQueue(){
  25. if (stackB.isEmpty()){
  26. if (stackA.isEmpty()){
  27. return null;
  28. }
  29. fetchFormStackA();
  30. }
  31. return stackB.pop();
  32. }
  33. /**
  34. * 从stackA栈中拿到出栈元素压入栈B
  35. */
  36. private void fetchFormStackA() {
  37. while (!stackA.isEmpty()){
  38. stackB.push(stackA.pop());
  39. }
  40. }
  41. public static void main(String[] args) {
  42. StackImplQueue stackQueue = new StackImplQueue();
  43. stackQueue.enQueue(1);
  44. stackQueue.enQueue(2);
  45. stackQueue.enQueue(3);
  46. System.out.println(stackQueue.deQueue());
  47. System.out.println(stackQueue.deQueue());
  48. System.out.println(stackQueue.deQueue());
  49. stackQueue.enQueue(4);
  50. System.out.println(stackQueue.deQueue());
  51. }
  52. }
打印结果

 

输入图片说明
1540435153368.png

 

题外话:时间复杂度

入栈操作的时间复杂度显然是O(1)

出栈操作的时间复杂度如果发生转移的话就是O(n)

如果没有发生转移的话也是O(1)

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号