利用栈模拟队列

1.思路分析

     (1)首先我们要了解队列和栈的特点。

先来说栈,插入和取出操作都在一端进行,它的结构可以比作一个“弹夹”,导致它的特点是“先进后出”;

再说队列,插入在队尾操作,取出在队首操作,它的结构可以比作一个“单向隧道”,所以它的特点是“先进先出”。

     (2)根据他的特点,可以用两个栈来模拟队列,具体的逻辑结构如下:

2.具体实现

     (1)如何利用栈来执行队列的插入操作

- 代码演示:

class MyQueue<E> {

     //创建两个栈

     private Stack<E> in = new Stack<E>();

     private Stack<E> out = new Stack<E>();

    

     //判空

     public boolean isEmpty() {

           return in.size()==0 && out.size()==0;

     }

    

     //入队

     public void offer(E e) {

           //清空out栈,全都入in栈

           while(!out.isEmpty()) {

                 in.push(out.pop());

           }

           //新元素入栈

           in.push(e);

     }

    

    

}

- 说明:

第一步:插入新元素时,先判断out栈是否为空,若不为空,把out栈里的元素全部转移到in栈(这样可以保证队列的特点:最先进入的元素应该最先出去即添加的新元素始终在“队首”)

第二步:当out栈为空之后,添加新元素至in栈,这时所有的元素都在in栈里面,并且顺序是最先进入的元素在栈底。

(2)如何利用栈来执行队列的取出操作

-  代码实现

//出队

     public E poll() {

           //清空in栈、入out栈

           while(!in.isEmpty()) {

                 out.push(in.pop());

           }

           //出栈

           return out.pop();

     }

  • 说明:

执行“出队”操作,即“先进先出”。用栈来表示:

第一步:把in栈里的元素先全部转移到out栈中

第二步:从out栈中取出所有元素

第三步:把第二步的结果作为“出队”操作的返回值即可。

总结:用两个栈作为中间缓存,只要保证“队列”的先进先出特性即可。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值