教你用栈实现队列怎么写

news2024/10/7 11:25:12

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。

队列(Queue)和栈(Stack)是两个基本的数据结构。队列是一种先进先出(First-In-First-Out, FIFO)的数据结构,而栈是一种后进先出(Last-In-First-Out, LIFO)的数据结构。有时候,我们需要使用栈来实现队列的功能,即将栈转化为队列。在本篇博客中,笔者将介绍如何使用栈实现队列,并给出相应的Java代码示例。

队列先进先出,很好理解,栈的话是先入后出的结构,如果用栈实现队列,就要使用两个栈,将入栈的元素取出来放进另一个栈中,这样先进去的元素也能先出来。

实现原理:
要使用栈实现队列,我们可以借助两个栈来实现。一个栈用于存储入队的元素,另一个栈用于存储出队的元素。当需要执行入队操作时,将元素压入入队栈中。当需要执行出队操作时,首先检查出队栈是否为空,如果不为空,则直接从出队栈中弹出元素;如果为空,则将入队栈的元素逐个弹出并压入出队栈中,然后再从出队栈中弹出元素。这样,就可以实现队列的先进先出特性。

队列如图所示:放入元素依次是 1 2 3 4 … 如果弹出来,依次是:1 2 3 4 …
在这里插入图片描述
那么如果用栈来实现队列,则需要两个,如图所示:
将第一个栈的元素依次弹出来放进另一个栈中,这样,另一个栈中取出来的元素就和队列的顺序一模一样了,切记:入栈的所有元素要一次性全部取出,这样才能保证出栈入栈的顺序和队列一致!
在这里插入图片描述

上代码!

class MyQueue {// 用栈实现队列
    // 由于栈是先进的后出来,队列是先进的先出,所以这里需要用两个栈来模拟一个进栈,一个出栈
    Stack<Integer> stackIn;
    Stack<Integer> stackOut;

    public MyQueue() {
        stackIn = new Stack<>();
        stackOut = new Stack<>();
    }
    
    // 模拟队列,push向队尾放元素
    public void push(int x) {
        stackIn.push(x);
    }
    
    // 取元素,把所有的入栈元素取出来放进出栈中,模拟队列先进先出
    public int pop() {
        changePlace();// 改变了入栈的顺序
        return stackOut.pop();

    }
    
    // 返回队列开头的元素
    public int peek() {
        // 确定是不是出栈的元素,如果为空,或者入栈还有元素,进行处理,再调用changePlace() 改变顺序
        changePlace();
        return stackOut.peek(); // 现在返回的就是队列的第一个元素
    }
    
    // peek()方法还可以这么写:
    /*
    public int peek() {
        int result = this.pop(); // 调用pop弹出元素
        stackOut.push(result);// 然后再放回去
        return result;// 返回弹出的元素,这样也可以保证只是查看第一个元素
    }
    */
    
    public boolean empty() {
        // 判断出栈 和 入栈的元素都为空,才是真的为空
        return stackIn.isEmpty() && stackOut.isEmpty();
    }

    // 改变出栈和入栈的位置,如果出栈有元素,直接返回,如果出栈为空,再把入栈元素放进出栈,避免出栈还有数据的时候,把入栈放进去,位置变乱
    private void changePlace() {
        if(!stackOut.isEmpty()) {
            return ;
        }
        // 取出入栈的元素放进出栈,这样出栈的元素就能正确让先入栈的元素按先入先出的顺序出来
        while(!stackIn.isEmpty()) {
            // 入栈弹出的元素:stackIn.pop
            stackOut.push(stackIn.pop());
        }
    }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = new MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.empty();
 */

最后

在这个构造方法中,我们创建了两个Stack类型的对象:stackIn和stackOut。通过调用new Stack<>()来实例化这两个栈对象。stackIn = new Stack<>()的作用是将新创建的Stack对象分配给stackIn变量,以便在整个类的范围内都可以使用该变量引用栈对象。这样,在创建MyQueue类的对象时,构造方法将会被调用,并且stackIn和stackOut栈对象将被初始化为空栈。通过这样的构造方法,我们为MyQueue类的实例提供了初始状态,并确保在使用栈对象之前它们已经被实例化。

将 new Stack<>() 放在构造方法内部的好处是,它可以确保每个 MyQueue 对象都有自己的独立的 stackIn 和 stackOut 实例。这样,即使创建多个 MyQueue 对象,它们之间的栈对象不会共享,每个对象都有自己独立的栈用于存储数据。

如果将 new Stack<>() 放在类的成员变量声明处(即放在外面),这意味着所有的 MyQueue 对象将共享同一个 Stack 对象,而不是每个对象都有自己的独立实例。这可能导致在并发环境中出现问题,因为多个对象之间共享同一个栈可能会导致数据混乱或错误的行为。

因此,为了确保每个 MyQueue 对象都有自己独立的栈对象,一般会将 new Stack<>() 放在构造方法内部,这样每个对象都有自己的栈实例来存储数据。这样做可以保证对象之间的隔离性和数据的正确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/635332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring】——Spring生命周期

前言 ❤️❤️❤️Spring专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring_冷兮雪的博客-CSDN博客 前面我们讲完了Spring中有关Bean的读和取&#xff0c;我们还没有好好去了解了解Bean对象&#xff0c;这篇 …

XML文件原理详解

文章目录 一、简介1. XML定义2. 测试3. HTML和XML的区别 二、XML基本语法1. 语法规则2. 元素的属性3. CDATA4. DTD文件5. XSD文件 三、Java解析XML1. 简介2. 解析XML文件 四、Xpath1. 简介2. Xpath的使用 一、简介 1. XML定义 XML&#xff08;可扩展标记语言&#xff09;是一…

高压放大器在介电材料中的应用有哪些

高压放大器是一种能够输出高电压的放大器&#xff0c;具有多种应用&#xff0c;其中之一就是在介电材料中的应用。介电材料是指能够保持一定电荷和电场状态的物质&#xff0c;其特点包括绝缘性、极化性和介电常数等。下面安泰电子将详细介绍高压放大器在介电材料中的应用。 介电…

《HarmonyOS开发 – OpenHarmony开发笔记(基于小型系统)》第4章 OpenHarmony应用开发实例

开发环境&#xff1a; 开发系统&#xff1a;Ubuntu 20.04 开发板&#xff1a;Pegasus物联网开发板 MCU&#xff1a;Hi3861 OpenHarmony版本&#xff1a;3.0.1-LTS 4.1新建工程及配置 1.新建工程及源码 新建目录 $ mkdir hello在applications/sample/myapp中新建src目录以及…

【零基础学机器学习 5】机器学习中的分类:什么是分类以及分类模型

&#x1f468;‍&#x1f4bb; 作者简介&#xff1a;程序员半夏 , 一名全栈程序员&#xff0c;擅长使用各种编程语言和框架&#xff0c;如JavaScript、React、Node.js、Java、Python、Django、MySQL等.专注于大前端与后端的硬核干货分享,同时是一个随缘更新的UP主. 你可以在各个…

华为OD机试真题 JavaScript 实现【字符串加密】【2023Q1 100分】,附详细解题思路

一、题目描述 有一种技巧可以对数据进行加密&#xff0c;它使用一个单词作为它的密匙。下面是它的工作原理&#xff1a;首先&#xff0c;选择一个单词作为密匙&#xff0c;如TRAILBLAZERS。如果单词中包含有重复的字母&#xff0c;只保留第1个&#xff0c;将所得结果作为新字母…

Spark大数据处理学习笔记(2.4)IDEA开发词频统计项目

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/0qE1L】 文章目录 一、词频统计准备工作1.1 安装Scala2.12.151.2 启动集群的HDFS与Spark1.3 在HDFS上准备单词文件 二、本地模式运行Spark项目2.1 新建Maven项目2.2 添加项目相关依赖2.3 创建日志…

009:vue中el-table删除当前行的代码示例

第009个 查看专栏目录: VUE — element UI echarts&#xff0c;openlayers&#xff0c;cesium&#xff0c;leaflet&#xff0c;mapbox&#xff0c;d3&#xff0c;canvas 免费交流社区 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例…

计算机网络(网络层,传输层,应用层,复习自用)

计算机网络 网络层网络层功能IP数据报格式IP数据报分片IPV4地址网络地址转换&#xff08;NAT&#xff09;子网划分与子网掩码无分类编址CIDRARP协议DHCP协议ICMP协议IPV6路由算法及路由协议RIR协议及距离向量算法OSPF协议及链路状态算法BGP协议IP组播移动IP网络层设备 传输层传…

Linux 部署Java项目-jar包和war包(五)

文章目录 一、前景&#xff08;jar包和war包区别&#xff09;一、部署jar包程序1. 项目打成jar包①方式一&#xff1a;使用idea工具打包项目②方式二&#xff1a;通过cmd命令的方式打包项目 2. 项目命令启动① 查看之前启动的程序&#xff0c;关闭之② 启动程序③ 验证是否部署…

Vue中如何进行数据筛选与搜索功能实现

Vue中如何进行数据筛选与搜索功能实现 在Vue应用中&#xff0c;数据筛选和搜索是常见的需求。本文将介绍如何在Vue中进行数据筛选和搜索功能的实现&#xff0c;包括基于原生JavaScript的筛选和搜索、基于Lodash库的筛选和搜索、以及基于Vue插件的筛选和搜索。 基于原生JavaScr…

Hazel游戏引擎(012)GLFW窗口事件

文中若有代码、术语等错误&#xff0c;欢迎指正 文章目录 前言如何确定GLFW窗口事件的回调函数参数Application接收事件回调流程原项目流程(12345)自己写的简单Demo与流程(123) 前言 此节目的 为了完成008计划窗口事件的接收glfw窗口事件以及回调部分 此节要完成 使用glfw函数…

C语言之指针初阶(1)

本章重点 1. 指针是什么 2. 指针和指针类型 3. 野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 今天我们讲解前4个稍微简单一点的内容&#xff0c;下一篇博客讲解后三部分 首先引入话题 我们口语讲到指针&#xff0c;比如p指针&#xff0c;其实想要…

【0基础自研记录】ESP32-CAM自制个人网络监控

目的&#xff1a;实现一个小型家庭监控 一、前期准备 1.硬件准备 esp32-acm烧录板烧录线 2.软件准备 Arduion IDE CH340串口驱动 下载地址如下 Arduion IDE:https://www.arduino.cc/en/software CH340串口驱动 链接&#xff1a;https://pan.baidu.com/s/1ri8dK7wW6KFz8rOPs…

已知一个整数,如何判断这个整数是无符号的?

前言 记录6月11日&#xff0c;肯哥在群里面分享的一个问题。说实话&#xff0c;看到题目想了半天没明白。一看答案&#xff0c;才发现&#xff0c;这题真的简单。 题目 已知一个整数&#xff0c;如何判断这个整数是无符号的&#xff1f; 题解 &#xff08;1&#xff09;因为我的…

JVM相关特性

每个使用Java的开发者都知道Java字节码是在JRE中运行(JRE: Java 运行时环境)。JVM则是JRE中的核心组成部分&#xff0c;承担分析和执行Java字节码的工作&#xff0c;而Java程序员通常并不需要深入了解JVM运行情况就可以开发出大型应用和类库。尽管如此&#xff0c;如果你对JVM有…

008:vue中el-upload不显示上传的文件列表

第008个 查看专栏目录: VUE — element UI echarts&#xff0c;openlayers&#xff0c;cesium&#xff0c;leaflet&#xff0c;mapbox&#xff0c;d3&#xff0c;canvas 免费交流社区 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例…

废柴日记8:从入门到入狱的Python爬虫学习笔记1(入门篇)

前言&#xff1a;我错了&#xff0c;但下次也不一定(●’◡’●) 米娜桑&#xff0c;好久不见&#xff0c;不知道这段时间各位手中的西瓜刀有没有按时擦亮呢&#xff1f; 我也是在摸爬滚打将近一年之后总算是找到了一点人生的方向所以当成救命稻草现在正死死握紧不放手的啊。…

【Windows 系统笔记】使用服务器运行装载AList+本地安装RaiDrive进行网盘本地挂载

文章目录 前言准备工作一、购买一台云服务器配置服务器安装宝塔面板新建网站进入当前目录 二、安装AList三、登录四、开启域名访问五、挂载阿里云盘刷新令牌 六、使用RaiDrive挂载到本地 前言 大家肯定很好奇我为什么要写一篇这样的文章&#xff0c;因为之前一直使用本地挂载网…

SQL索引

一、索引概述 介绍&#xff1a; 索引是帮助MySQL高效获取数据的数据结构&#xff08;有序&#xff09;。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c;这样就可以…