用两个栈实现队列,支持队列的基本操作(add、poll、peek)

本文介绍了如何使用两个栈A和B来模拟队列,保证先进先出的顺序。讨论了可能导致顺序错误的问题,如A栈数据导入B栈后A仍有残留,以及A数据导入B时B中已有数据。为解决这些问题,提出了限制add()操作,并通过poll()和peek()方法自动转移A栈数据至B栈的策略。此外,规定B栈非空时禁止A栈数据转移,以及A栈转移至B栈时需完全转移。最后,给出了2021年4月16日的实现代码作为博客的开始。
摘要由CSDN通过智能技术生成

基本原理:

  现有两个栈,栈A、栈B。我们都知道栈的顺序的是先进后出,而队列是先进先出。先将数存在A中,再从A读取到B中,用户最终是从B中读取存的数据。比如:要将1-2-3-4-5保存在队列中,那么最终读取的顺序应该也是1-2-3-4-5。先存放在A中,A是栈所以读取的顺序为5-4-3-2-1,5-4-3-2-1又逐一存放在栈B中,所以最终读取顺序就为1-2-3-4-5。

能够导致顺序错误的问题:

  • A数据导入B后A中仍有残留数据
      这种情况下会导致顺序错乱!
      例如:1-2-3-4-5 逐一push进A栈,但是只pop了5-4-3,此时在A栈中还剩下2-1,若此时B栈进行pop或A栈进行push都会发生错误。
  • A数据导入B时,B中仍有数据
      B栈数据的顺序应高于A栈,但此时A栈pop出一个数,push进B栈,由于栈的特性,刚push进的数的顺序就高于原先存在B栈的数,这显然不合理!

解决顺序错误的问题:

(要实现的方法:add()、poll()、peek())

  • 禁止add() 对A、B栈pop操作的权利,若用户需要访问数据,则由poll()、peek()自己将A中数据转移到B。
  • B中仍有数据时,禁止A转移数据进B
  • B中无数据时,从A转移数据时,必须全部转移,禁止有剩余

实现代码:

import java.util.Stack;

public class A_Queue_Of_Two_Stacks {
   
    //创建两个栈
    private static Stack<Integer> stackPush = new Stack<>();
    private static Stack<Integer> stackPop = new Stack<>();

    //当进行add操作时,先全部存放在stackPush中
    // 当想要poll时,检查stackPop中是否还存在数
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值