Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用数组结构实现大小固定的队列和栈(java)

用数组结构实现大小固定的队列和栈(java)

作者头像
用户5513909
发布于 2023-04-25 03:29:26
发布于 2023-04-25 03:29:26
93700
代码可运行
举报
运行总次数:0
代码可运行

栈的实现

栈的特点是先进后出,所以用数组实现栈时,只需要利用一个指针判定数据存储的位置即可,添加元素时判断指针是否超过数组长度,如果没有越界将元素添加到指针所指的位置,并将指针向下移动一位;否则返回异常,显示栈空间已满。删除元素思路类似,判断指针是否为数组初始位置,不是则将指针所指元素返回,并将指针向上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ArrayStack {
    private Integer[] arr;
    private Integer index;
//初始化栈
    public ArrayStack(int initSize) {
        if(initSize < 0){
            throw new IllegalArgumentException("The init size is less than 0");
        }
        arr = new Integer[initSize];
        index = 0;
    }
//返回栈顶元素
    public Integer peek() {
        if(index == 0) {
            return null;
        }
        return arr[index - 1];
    }
//入栈
    public void push(int obj) {
        if (index == arr.length) {
            throw new ArrayIndexOutOfBoundsException("The queue is full");
        }
        arr[index++] = obj;
    }
//出栈
    public Integer pop() {
        if(index == 0){
            throw new ArrayIndexOutOfBoundsException("The queue is empty");
        }
        return arr[--index];
    }
}

队列的实现

队列的特点是先进先出"FIFO",所以用数组实现队列操作时,我们需要利用三个变量对数组进行操作,start指针用于记录先进队列的数据,end指针始终指向存入数据的下个位置,如果指针越界则返回0点。size用于记录队列中元素的个数,加入元素时需要先判断size大小是否超过数组的长度,如果超出则抛出异常显示队列已满,反之则将元素添加至end指针所指的位置,并将end指针移位(需要判断是否发生指针越界)。引用三个变量start、end、size能够让代码简单一点,更好理解。当队列未满时(cur_size<length),新加入的数放到end位置,当队列不为空时(size>0),出队的数为start位置的数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ArrayQueue {
    private Integer[] arr;
    private Integer size;
    private Integer start;
    private Integer end;
//初始化队列大小
    public ArrayQueue(int initSize){
        if (initSize < 0) {
            throw new IllegalArgumentException("The init size is less than 0");
        }
        arr = new Integer[initSize];
        size = 0;
        start = 0;
        end = 0;
    }
//返回队顶元素
    public Integer peek() {
        if(size == 0) {
            return null;
        }
        return arr[start];
    }
//入队
    public void push(int obj) {
        if(size == arr.length) {
            throw new ArrayIndexOutOfBoundsException("The queue is full");
        }
        size++;
        arr[end] = obj;
        end = (end == arr.length - 1)? 0 : end + 1;
    }
//出队
    public Integer poll() {
        if(size == 0) {
            throw new ArrayIndexOutOfBoundsException("The queue is empty");
        }
        size--;
        int tmp = start;
        start = (start == arr.length - 1)? 0 : start + 1;
        return arr[tmp];
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[算法题] 使用数组实现栈和队列
1. 使用数组实现栈 public class ArrayToStack { public static class ArrayStack{ private Integer[] arr; // 使用数组表示栈这个容器 private Integer index; // 使用index表示栈当前可以存放元素的下标 public ArrayStack(Integer initSize) { if(initSize < 0)
CoderJed
2019/05/14
6450
数组
数组是一个相同类型的变量的集合,注意数组是长度固定的,而且本身也属于引用类型 之前说过字符串和数组经常使用,所以这里先讲一下下字符串和字符数组互转
晚上没宵夜
2020/03/11
4040
关于队列的几个小算法
1、用静态数组实现队列的基本操作   思路 :创建3个变量,start,end,size; size用来查看数组中数据的数量,从而实现添加和删除的长度控制。当添加数据时,如果end=size-1;说
曼路
2018/10/18
4300
数据结构之队列
用户11332765
2024/10/28
960
数据结构之队列
【数据结构】—— 队列基础知识以及数组模拟队列的分析、演示及优化
2)遵循先入先出的原则。即先存入队列的数据要先取出,后存入队列的数据要后取出。(加数据是在队列的尾部加,取数据是在队列的首部取)
周小末天天开心
2022/11/18
3070
【数据结构】—— 队列基础知识以及数组模拟队列的分析、演示及优化
栈和队列的相关问题
 队列可能稍微有点复杂,定义队列的时候需要定义三个变量,分别是end,start,size,先说说他们分别的作用,每次用户拿队中的元素,都从start下标位置取,每次进队都从s=end位置进,每次出队或者进队size都要++或--  假设数组长度是3,如果size没有到3,进队时就把元素放到end的位置上,这是end和size之间的约束关系;如果size不等于0,出队时就总出start位置,这是start和size之间的约束关系。end本身还有一个约束关系,end是控制进队的,所以每次进一个元素end就++,如果end==数组长度,那么end就回到开头也就是0位置
mathor
2018/08/17
7340
栈和队列的相关问题
用数组结构实现大小固定的队列和栈
一.用数组结构实现大小固定的栈 public static class ArrayStack { private Integer[] arr; private Integer size; public ArrayStack(int initSize) { if (initSize < 0) { throw new IllegalArgumentException("The init size is less than 0"); } a
大学里的混子
2019/02/18
1.2K0
数据结构 01
数据结构是计算机相关专业的基础课程,不管学什么编程语言,都要学习数据结构。接下来就一起来了解一下吧。
贪挽懒月
2019/02/20
7820
关于栈的几个小算法
    想法就是创建一个index变量,index指向含有值得下一个数组空间(假设数组中有两个值,index指向2)
曼路
2018/10/18
2940
数据结构与算法 —— Java 实现(线性表)
在学 java 基础的时候,我们会经常用到数组来存储相同类型的数据,下面我们就来简单回顾一下 Java 数组的简单使用,实在忘记怎么使用 java 数组的同学可以查看这篇文章 Java 数组的使用
Gorit
2021/12/08
7200
数据结构与算法 —— Java 实现(线性表)
数据结构(三)| 用数组实现队列和栈
在上一篇文章 数据结构(二)| 队列与栈 中,我用双向链表实现了队列和栈,本文用数组来实现。
行百里er
2021/07/14
2K0
【数据结构与算法】队列
计算机科学中,queue 是以顺序的方式维护的一组数据集合,在一端添加数据,从另一端移除数据。习惯来说,添加的一端称为尾,移除的一端称为头,就如同生活中的排队买商品
程序员波特
2024/09/25
960
【数据结构与算法】队列
数组模拟队列
队列是一个有序列表,可以用数组或链表来实现,队列遵循先进先出的原则,即先存入的队列的数据要先取出,比如银行的排队叫号系统。
切图仔
2022/09/14
3610
数组模拟队列
Qz学算法-数据结构篇(稀疏数组、队列)
数据结构包括:线性结构和非线性结构。所以博主会通过这两个角度来对线性结构和非线性结构进行梳理归纳。
浅辄
2023/06/03
1810
数据结构(数组、链表、栈、队列、树)
二叉树(Binary tree)是树形结构的一个重要类型。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。许多实际问题抽象出来的数据结构往往是二叉树形式,二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。
鱼找水需要时间
2023/04/28
4000
数据结构(数组、链表、栈、队列、树)
java数据结构之线性结构和非线性结构
二维数组 转 稀疏数组的思路 1. 遍历 原始的二维数组,得到有效的个数sum。 2. 根据sum就可以创建 稀疏数组 sparseArr int[sum + 1][3]。 3. 将二维数组的有效数据存入到 稀疏数组。 稀疏数组转原始的二维数组的思路 1. 先读取稀疏数组的第一行,根据第二行的数据,创建原始的二维数组,比如上面的 chessArr2 = int[11][11] 2. 在读取稀疏数组后几行的数据,并赋值给 原始的二维数组即可。
海仔
2019/08/05
7990
java数据结构之线性结构和非线性结构
稀疏数组和队列
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
用户9615083
2022/12/30
4460
稀疏数组和队列
【数据结构与算法】栈
计算机科学中,stack 是一种线性的数据结构,只能在其一端添加数据和移除数据。习惯来说,这一端称之为栈顶,另一端不能操作数据的称之为栈底,就如同生活中的一摞书
程序员波特
2024/09/26
870
常见的线性结构
  本篇博客主要是记录手写这些这数据结构的底层实现,加深对线性结构的理解,实现自己的一个小型数据结构库,也会进行简单的时间复杂度分析,对不同的实现进行比较和优化,即侧重于代码实现。由于数据结构是实践性比较强的一个科目,希望大家在看这篇博客时,自己也去写一下代码,看一下运行结果是不是自己想要的,我也会贴出我的运行结果来进行分析。
程序员波特
2024/01/19
2190
常见的线性结构
数据结构
稀疏数组(sparse array)是一种只为数组中的非零元素分配内存的特殊类型数组
静谧星空TEL
2021/04/27
2950
相关推荐
[算法题] 使用数组实现栈和队列
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验