当前位置: 首页 > news >正文

使用两个栈实现队列,简单例子

栈, 取值是先进后出 ,后进先出。

那么怎么能按照队列方式(先进先出)存值后取值呢?

看以下代码:

import java.util.Stack;

/**
 * @Author : JCccc
 * @Description :
 * @Point: Keep a good mood
 **/
public class StackQueue {


    Stack<Integer> stackSave = new Stack<Integer>();
    Stack<Integer> stackRemove = new Stack<Integer>();

    @Override
    public String toString() {
        return "StackQueue{" +
                "stackSave=" + stackSave +
                ", stackRemove=" + stackRemove +
                '}';
    }

    public void push(int node) {

        stackSave.push(node);
    }

    public int pop() {

        if (stackRemove.empty()) {
            while (!stackSave.empty())
                stackRemove.push(stackSave.pop());
        }

        return stackRemove.pop();
    }


    public static void main(String[] args) {

        StackQueue stackQueue=new StackQueue();
        stackQueue.push(1);
        stackQueue.push(2);
        stackQueue.push(3);
        stackQueue.push(4);

        System.out.println(stackQueue.toString());
        stackQueue.pop();
        System.out.println(stackQueue.toString());
        stackQueue.pop();
        System.out.println(stackQueue.toString());
        stackQueue.pop();
        System.out.println(stackQueue.toString());

    }

}

运行结果为:

 

实现原理分析:

因为栈是先进后出,那么意味着在一个栈一个值的时候是没影响的,否则 就;

所以我们利用两个栈实现队列取值方式。

一个SAVE栈用于我们存入数据,

如代码,我连续先后存入1,2,3,4;

则SAVE栈此刻状态应该是:

取值的时候,先判断REMOVE栈是否是空的,空的就直接把SAVE栈数据的值全部一个个取出,全部存入REMOVE栈

,直到SAVE栈数据为空即停止。

这样操作后,REMOVE栈此刻状态应该是:

然后,从REMOVE栈一个个取值就是1,2,3,4这样的顺序了。

 

当然,如果你没细想,可能会纠结那个判断,当判断REMOVE栈不为空的情况。

那么,如果REMOVE栈不为空,证明SAVE之前就倒过一次数据了,REMOVE栈的数据肯定取出来也是正常的。

因为我们的代码里,开始放数据都是放SAVE栈的。

 

好了,就到此。

 

 

 

相关文章:

  • 数据库ACID
  • 线程小记
  • JAVA JDK1.8 时间戳与时间格式化 实用工具类
  • 单例模式 之内部类延迟加载,(多)线程安全
  • Springboot 用session监听器统计在线用户数量
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • JAVA 责任链设计模式
  • JAVA回调函数简单讲解 CallBack
  • JAVA HttpClient 远程调用接口doGet、doPost工具类
  • JAVA 接口签名sign生成 工具类
  • mybatis-config配置文件各项简单介绍
  • Springboot整合Mybatis增删查改、连接MYSQL数据库及配置druid连接池
  • JAVA 模板设计模式
  • Springboot 最简单的结合MYSQL数据实现EXCEL表格导出及数据导入
  • Springboot中使用GSON报错 An attempt was made to call the method com.google.gson.GsonBuilder.setLenient
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • HTML5新特性总结
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • php面试题 汇集2
  • Ruby 2.x 源代码分析:扩展 概述
  • sessionStorage和localStorage
  • SQLServer之创建数据库快照
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Vue2 SSR 的优化之旅
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 批量截取pdf文件
  • 小李飞刀:SQL题目刷起来!
  • 异常机制详解
  • 在Unity中实现一个简单的消息管理器
  • Semaphore
  • ​第20课 在Android Native开发中加入新的C++类
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (Java)【深基9.例1】选举学生会
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转)关于多人操作数据的处理策略
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .gitignore
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core开源商城系统源码,支持可视化布局小程序
  • .net framework profiles /.net framework 配置
  • .net web项目 调用webService
  • .NET 解决重复提交问题
  • .NET 设计模式初探
  • .net 中viewstate的原理和使用
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .Net中wcf服务生成及调用
  • /*在DataTable中更新、删除数据*/
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...