首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用数组结构实现大小固定的队列和栈(java)

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

作者头像
用户5513909
发布于 2023-04-25 03:29:26
发布于 2023-04-25 03:29:26
99000
代码可运行
举报
运行总次数: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用数组结构实现大小固定的队列和栈
一.用数组结构实现大小固定的栈 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
[算法题] 使用数组实现栈和队列
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
6540
栈和队列的相关问题
 队列可能稍微有点复杂,定义队列的时候需要定义三个变量,分别是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
7500
栈和队列的相关问题
常见的线性结构
  本篇博客主要是记录手写这些这数据结构的底层实现,加深对线性结构的理解,实现自己的一个小型数据结构库,也会进行简单的时间复杂度分析,对不同的实现进行比较和优化,即侧重于代码实现。由于数据结构是实践性比较强的一个科目,希望大家在看这篇博客时,自己也去写一下代码,看一下运行结果是不是自己想要的,我也会贴出我的运行结果来进行分析。
程序员波特
2024/01/19
2340
常见的线性结构
数组
数组是一个相同类型的变量的集合,注意数组是长度固定的,而且本身也属于引用类型 之前说过字符串和数组经常使用,所以这里先讲一下下字符串和字符数组互转
晚上没宵夜
2020/03/11
4060
数据结构之链表,使用链表实现栈以及使用链表实现队列
1、结合之前实现的链表这个数据结构,如果只对链表的头部进行增加和删除,时间复杂度是O(1)的,只对链表的头部进行查询的话,时间复杂度是O(1)的。那么,满足这样的数据结构是什么呢,就是栈,栈这种数据结构是后入先出的,或者先进后出的,只对栈的一端,就是栈顶进行操作,无论是添加元素、删除元素、查询元素,都是在栈顶进行的。所以对于链表来说,可以将链表的头部当作栈顶,用链表做为栈的底层实现来实现一个栈。
别先生
2020/03/19
8760
线性结构之栈和队列
举个不太恰当的比喻,栈就像一个直径比乒乓球大点的水杯,而元素就像是乒乓球,现在我们要把几个乒乓球放入杯子里。因为杯子底部是实的,所以我们只能从杯口放入兵乓球,我们把乒乓球放入这个水杯的过程就是入栈,把兵乓球从杯子中取出的过程就是出栈。这个杯子的杯口就是栈顶,而在最上面的那个乒乓球就是栈顶元素。当我们想从水杯里拿乒乓球的时候,只能从最上面的开始拿,无法从底部或中间开始拿,符合后进先出的特性:
端碗吹水
2020/09/23
3050
线性结构之栈和队列
数据结构与算法(2)——栈和队列栈队列LeetCode 相关题目整理其他题目整理
栈是一种用于存储数据的简单数据结构(与链表类似)。数据入栈的次序是栈的关键。可以把一桶桶装的薯片看作是一个栈的例子,当薯片做好之后,它们会依次被添加到桶里,每一片都会是当前的最上面一片,而每次我们取的时候也是取的最上面的那一片,规定你不能破坏桶也不能把底部捅穿,所以第一个放入桶的薯片只能最后一个从桶里取出;
我没有三颗心脏
2018/07/24
1.4K0
【数据结构与算法】栈
计算机科学中,stack 是一种线性的数据结构,只能在其一端添加数据和移除数据。习惯来说,这一端称之为栈顶,另一端不能操作数据的称之为栈底,就如同生活中的一摞书
程序员波特
2024/09/26
960
搞定数据结构-栈和队列
如下,使用栈结构操作. “网”这个错别字在栈顶,“网”改成”望”只需要将“网”从栈顶移除重新写入”望”.
用户3045442
2019/11/06
5760
搞定数据结构-栈和队列
【数据结构与算法】队列
计算机科学中,queue 是以顺序的方式维护的一组数据集合,在一端添加数据,从另一端移除数据。习惯来说,添加的一端称为尾,移除的一端称为头,就如同生活中的排队买商品
程序员波特
2024/09/25
1090
【数据结构与算法】队列
关于队列的几个小算法
1、用静态数组实现队列的基本操作   思路 :创建3个变量,start,end,size; size用来查看数组中数据的数量,从而实现添加和删除的长度控制。当添加数据时,如果end=size-1;说
曼路
2018/10/18
4340
数据结构之栈和队列
​ 在JDK中,Java Stack类是vector的一个子类,继承vector,在util包下。并且只定义了默认构造方法,大部分方法的实现也来源于vector。
归思君
2023/10/16
2050
数据结构之栈和队列
Java实现基本数据结构(三)——队列
阅读本文前,最好先学习顺序表和栈的基本操作和实现原理,也就是弄清楚数组和栈的原理,点击Java实现基本数据结构(一)——数组,Java实现基本数据结构(二)——栈。先学习前置内容,学习效果更好哦!
星如月勿忘初心
2020/08/02
7830
数据结构 01
数据结构是计算机相关专业的基础课程,不管学什么编程语言,都要学习数据结构。接下来就一起来了解一下吧。
贪挽懒月
2019/02/20
7880
数据结构(三)| 用数组实现队列和栈
在上一篇文章 数据结构(二)| 队列与栈 中,我用双向链表实现了队列和栈,本文用数组来实现。
行百里er
2021/07/14
2K0
【数据结构题目】循环队列,以及队列实现栈的模拟
循环队列,顾名思义就是数组组成了一个圈,开始时队数组的头索引和为索引都在一个位置下。
用户11288949
2024/09/24
1380
【数据结构题目】循环队列,以及队列实现栈的模拟
数据结构之队列
用户11332765
2024/10/28
1150
数据结构之队列
【数据结构】—— 队列基础知识以及数组模拟队列的分析、演示及优化
2)遵循先入先出的原则。即先存入队列的数据要先取出,后存入队列的数据要后取出。(加数据是在队列的尾部加,取数据是在队列的首部取)
周小末天天开心
2022/11/18
3140
【数据结构】—— 队列基础知识以及数组模拟队列的分析、演示及优化
数据结构——队列
队列的概念:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
Albert_xiong
2021/06/21
4430
数据结构——队列
相关推荐
用数组结构实现大小固定的队列和栈
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档