数据结构_栈和队列

目录

一、栈

1.1 栈的使用

1.2 模拟实现栈

二、队列

2.1 队列的使用

2.2 环形队列

2.3 双端队列

总结


一、栈

只允许在固定的一端进行元素的插入和删除操作的一种特殊线性表。其中进行元素的插入和删除操作的一端称为栈顶,另一端称为栈底。栈遵循先进后出 (后进先出) 原则。

入栈:栈的插入操作称为入栈/进栈/压栈,入数据在栈顶

出栈:栈的删除操作称为出栈,出数据在栈顶

1.1 栈的使用

在 Java 中,提供了 Stack 类来表示栈。

【栈方法】

方法功能
E push(E e)将 e 入栈,并返回
E pop()将栈顶元素出栈,并返回
E peek()获取栈顶元素
int size()获取栈中有效元素个数
boolean empty()判断栈中是否为空

1.2 模拟实现栈

首先定义定义数组来实现栈、usedSize 记录栈中有效元素个数、并定义其默认容量及其构造方法。

    //数组实现栈
    private int[] array;
    //栈中有效元素个数
    private int usedSize = 0;
    //栈默认容量
    private static final int DEFAULT_CAPACITY = 10;

    public MyStack() {
        array = new int[DEFAULT_CAPACITY];
    }

1、push():入栈

    public void push(int e) {
        //若栈已满,则扩容
        if (full()) {
            array = Arrays.copyOf(array, 2*array.length);
        }
        //usedSize标记着栈中元素个数的同时,
        //由于下标从 0 开始计数,元素个数从 1 开始计数
        //所以 usedSize 可以视为栈顶元素下标 +1
        array[usedSize] = e;

        usedSize++;
    }
    //是否已满
    public boolean full() {
        return usedSize == array.length;
    }

 usedSize 做当前可存放元素的下标:

2、pop():栈顶元素出栈,并返回

    public int pop() {
        //若栈为空,则抛异常
        if (empty()) {
            throw new EmptyException("栈为空!");
        }
        //创建变量接收原栈顶元素
        int old = array[usedSize-1];

        //栈顶元素被获取
        usedSize--;

        //返回原栈顶元素
        return old;
    }

3、peek():获取栈顶元素 

    public int peek() {
        //栈中有效个数为 0,抛异常
        if (usedSize == 0) {
            throw new EmptyException("栈为空!");
        }
        //返回栈顶元素
        return array[usedSize-1];
    }

4、size():获取栈中有效元素个数

    public int size() {
        //返回栈中有效元素个数
        return usedSize;
    }

5、empty():判断栈是否为空

    public boolean empty() {
        //若栈中有效个数为 0,则返回 true;反之 false
        return usedSize == 0;
    }


二、队列

队列是只允许在一端进行插入数据操作,在另一端进行删除数据操作的一种特殊线性表。队列遵循先进先出原则。

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

2.1 队列的使用

在 Java 中,提供了 Queue 接口来表示队列,其底层是通过链表实现的。由于 Queue 是一个接口,所以实例化队列时必须实例化 LinkedList 对象,因为 LinkedList 实现了 Queue 接口。

【队列方法】

方法功能
boolean offer(E e)入队列
E poll()出队列
E peek()获取队头元素
int size()获取队列内有效元素个数
boolean isEmpty()判断队列内是否为空
import java.util.LinkedList;
import java.util.Queue;

public class QueueDemo {
    public static void main(String[] args) {
        //创建一个空队列
        Queue<Integer> queue = new LinkedList<>();

        //入队列
        queue.offer(11);
        queue.offer(22);
        queue.offer(33);

        //获取队头元素
        System.out.println(queue.peek()); //11

        //获取队列中有效元素个数
        System.out.println(queue.size()); //3

        //出队列:先进先出
        queue.poll(); //11最先进入,故 11出队列

        //再次获取队头元素
        System.out.println(queue.peek()); //22

        System.out.println(queue.size()); //2

        //判断队列是否为空
        System.out.println(queue.isEmpty()); //false
    }
}

2.2 环形队列

环形队列还可以叫做循环队列,顾名思义,即当队列存放元素至队列尾后,此时可存放元素的下标再次循环至队列头,其通常使用数组实现。在生产者消费者模型中,就可以使用循环队列。

在实现环形队列之前,我们先定义变量 front 与 rear,front 表示队列头,rear 表示当前可以存放元素的下标。

此时就需要解决 rear 与 front 相遇时队列为空还是为满的问题,这里我们采用浪费一个空间来判断队列是否已满,即当 rear 的下一个就是 front 时,此时认为队列已满,需等 front 下标元素出队,才可再次存放元素。

同时,还需解决 rear 怎么从 5 下标前往 0 下标的问题,我们可以使用 (rear+1) % length 来决定当前存放元素的下标。

class MyCircularQueue {

    public int[] array; //定义数组实现环形队列
    public int front = 0; //队头,初始为 0
    public int rear = 0; //当前存放元素的下标,初始为 0

    public MyCircularQueue(int size) {
        array = new int[size];
    }

    //入队
    public boolean inQueue(int value) {
        //若队列已满,则 false
        if (isFull()) {
            return false;
        }
        //存入元素
        array[rear] = value;
        //为防止前往 0 下标时出错,故不用 rear++
        rear = (rear+1) % array.length;

        return true;
    }

    //出队
    public boolean outQueue() {
        //若队列为空,则 false
        if (isEmpty()) {
            return false;
        }
        //与 rear 同理,防止前往 0 下标时出错
        front = (front+1) % array.length;

        return true;
    }

    //获取队头元素
    public int Front() {
        //若队列为空,则 -1
        if (isEmpty()) {
            return -1;
        }
        //返回 front 下标元素
        return array[front];
    }

    //获取队尾元素
    public int Rear() {
        //若队列为空,则 -1
        if (isEmpty()) {
            return -1;
        }
        //队尾元素是处于 rear 下标的前一个,
        //若 rear 下标为 0,则队尾元素在队列最大下标处;
        //其余情况,队尾元素处于 rear-1 下标处。
        int tail = rear == 0 ? array.length-1 : rear-1;
        return array[tail];
    }
    
    //判断队列是否为空
    public boolean isEmpty() {
        //若 front 与 rear 相等,则队列为空
        return front == rear;
    }
    
    //判断队列是否已满
    public boolean isFull() {
        //若 rear 的下一个是 front,则队列已满
        return (rear+1) % array.length == front;
    }
}

2.3 双端队列

双端队列是指在队列两端都可以进行入队和出队的操作。Java 中提供 Deque 接口来表示双端队列。

【栈和队列均可使用 Deque 接口】

1、双端队列的线性实现:Deque<Integer> stack = new ArrayDeque<>();

2、双端队列的链式实现:Deque<Integer> queue = new LinkedList<>();


总结

1、栈遵循先进后出 (后进先出) 原则,队列遵循先进先出原则。

2、栈只允许在固定的一端进行元素的插入和删除操作。

3、队列只允许在一端进行插入数据操作,在另一端进行删除数据操作。

4、栈和队列均可使用 Deque 接口。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据分析第十一讲:pandas应用入门(六)

pandas应用入门&#xff08;六&#xff09; 我们再来看看Index类型&#xff0c;它为Series和DataFrame对象提供了索引服务&#xff0c;有了索引我们就可以排序数据&#xff08;sort_index方法&#xff09;、对齐数据&#xff08;在运算和合并数据时非常重要&#xff09;并实现…

2024最新宝塔面板8.1.0企业版开心版

官方更新记录 【增加】增加【网站】-【HTML项目】 【优化】优化Docker模块使用体验 【优化】优化文件压缩和解压的速度 【修复】修复在上一版本中出现的所有已知问题 开心版更新记录 1.在 PHP切换页面&#xff0c;出现报错弹窗属于正常情况&#xff0c;是因爲没安装 企业…

【数据结构】选择题

在数据结构中&#xff0c;从逻辑上可以把数据结构分为&#xff08;线性结构和非线性结构&#xff09; 当输入规模为n时&#xff0c;下列算法渐进复杂性中最低的是&#xff08;&#xff09; 时间复杂度 某线性表采用顺序存储结构&#xff0c;每个元素占4个存储单元&#xf…

YoloV8改进策略:Block篇|即插即用|StarNet,重写星操作,使用Block改进YoloV8(全网首发)

摘要 本文主要集中在介绍和分析一种新兴的学习范式——星操作&#xff08;Star Operation&#xff09;&#xff0c;这是一种通过元素级乘法融合不同子空间特征的方法&#xff0c;通过元素级乘法&#xff08;类似于“星”形符号的乘法操作&#xff09;将不同子空间的特征进行融…

【PB案例学习笔记】-23创建一个窗口菜单

写在前面 这是PB案例学习笔记系列文章的第23篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

windows系统中开发的GO程序生成docker镜像并部署到阿里云服务(linux系统)的操作说明

本文简述将go程序生成docker镜像的操作方法&#xff0c;以及如何部署到阿里云服务。其中go程序在windows系统中开发&#xff0c;阿里云服务的操作系统为linux&#xff08;centos7.9&#xff09;&#xff0c;以下为流程示意图&#xff1a; 一、window系统中开发go程序 程序实现…

深入理解预处理

1.预定义符号 C语言设置了⼀些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号也是在预处理期间处理的。 __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇期 __TIME__ //⽂件被编译的时间 __STDC__ //如果编译器遵循ANSI C&…

【Python/Pytorch 】-- 滑动窗口算法

文章目录 文章目录 00 写在前面01 基于Python版本的滑动窗口代码02 算法效果 00 写在前面 写这个算法原因是&#xff1a;训练了一个时序网络&#xff0c;该网络模型的时序维度为32&#xff0c;而测试数据的时序维度为90。因此需要采用滑动窗口的方法&#xff0c;生成一系列32…

LLM大语言模型应用方案之RAG检索增强生成的实现步骤。

0.我理解的RAG 什么是RAG&#xff1f; RAG的全称是“检索增强生成模型”&#xff08;Retrieval-Augmented Generation&#xff09;。这是一种特别聪明的大语言模型。 RAG是怎么工作的呢&#xff1f; 1.检索&#xff1a;当你问RAG一个问题时&#xff0c;它会先去“图书…

前端 JS 经典:数字变化动画

1. 需求 给你一个数字&#xff0c;当这个数字变化时&#xff0c;有一个动画的过渡效果。 2. 思路 首先我们要知道两个数字变化需要多少秒&#xff0c;然后变化的范围&#xff0c;算出变化的速度。记住开始变化的时间&#xff0c;然后通过 requestAnimationFrame 函数&#x…

深入理解Qt状态机的应用(二)

前文《深入理解Qt状态机的应用&#xff08;一&#xff09;》介绍了状态机的理论知识以及简单的状态机示例。在实际应用场景中&#xff0c;状态机往往会比较复杂&#xff1b;本文将详细介绍分组状态、历史状态、并行状态以及其他技术。 通过分组状态共享转换 还是以交通信号灯…

【计算机毕业设计】211校园约拍微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

进入docker容器内部操作mysql数据库

文章目录 1、查询docker容器2、进入mysql容器内部3、连接mysql数据库4、查询mysql所有的数据库5、使用某个数据库6、展示数据库中所有的表7、查询某张表8、断开mysql9、退出mysql容器 1、查询docker容器 [rootlocalhost ~]# docker ps CONTAINER ID IMAGE …

java.lang.ClassNotFoundException: javafx.util.Pair的问题解决与原因详解

先说解决办法: 1、引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.12</version> </dependency>2、更换代码依赖地址&#xff1a; 原来依赖地址&#xff1a; import j…

YOLOv10改进 | 注意力篇 | YOLOv10引入EMAttention(EMA)注意力

1. EMA介绍 1.1 摘要:在各种计算机视觉任务中说明了通道或空间注意机制在产生更可辨别的特征表示方面的显着有效性。 然而,通过通道降维来建模跨通道关系可能会给提取深度视觉表示带来副作用。 本文提出了一种新型高效的多尺度注意力(EMA)模块。 着眼于保留每个通道的信息…

springMVC的bug

写SpringMVC时&#xff0c;配置视图解析器路径中少写了个“/”导致url拼接错误&#xff0c;无法返回视图

机器学习参数寻优:方法、实例与分析

机器学习参数寻优:方法、实例与分析 机器学习模型的性能很大程度上依赖于其参数的选择。参数寻优(Hyperparameter Tuning)是提升模型表现的关键步骤之一。本文将详细介绍主流的参数寻优方法,包括网格搜索(Grid Search)、随机搜索(Random Search)、贝叶斯优化(Bayesia…

开发基于Java语言的SaaS(Software-as-a-Service,软件即服务)模式的HIS系统详解 HIS系统源码 支持二开

开发基于Java语言的SaaS&#xff08;Software-as-a-Service&#xff0c;软件即服务&#xff09;模式的HIS系统详解 HIS系统源码 支持二开 开发基于Java语言的SaaS&#xff08;Software-as-a-Service&#xff0c;软件即服务&#xff09;模式的HIS&#xff08;Hospital Informat…

SpringCloud Alibaba Sentinel 流量控制之流控模式实践总结

官网文档&#xff1a;https://sentinelguard.io/zh-cn/docs/flow-control.html wiki地址&#xff1a;https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6 本文版本&#xff1a;spring-cloud-starter-alibaba&#xff1a;2.2.0.RELEASE 如下图所…

STM32单片机I2C通信详解

文章目录 1. I2C通信概述 2. 硬件电路 3. I2C时序基本单元 4. I2C时序 4.1 指定地址写 4.2 当前地址读 4.3 指定地址读 5. I2C外设 6. I2C框图 7. I2C基本结构 8. 主机发送 9. 主机接收 10. 软件和硬件波形对比 11. 代码示例 1. I2C通信概述 I2C(Inter-Integrat…