队列

1、队列的理解

​ 个人理解,所有的数据结构都是给数据加的抽象规则,大家都学过数组,我们可以在数组的任意位置实现插入和取数据,但是,如果我给这个插入和取数据施加这样一个规则,我只允许你像排队一样,从队尾插入数据,从队头取数据,这就构成了队列这个数据结构,那么我们需要做什么呢?写代码描述这个规则

上图可能方便理解

如图:
定义一个数组
插入数据:a、b、c、d、e依次按顺序从队尾(rear)端插入数据,array[0] = a,array[1]=b.......
取出数据:只能从队头取,先取队头a

2、先进先出

​ 通过上图,你会发现队列满足先进先出原则,就和排队一样,你先排队,就可以先离开

3、java代码实现

1、确定有哪些元素

  • 头尾标志:rear,front,并且初值都为-1
  • 最大长度
  • 定义一个int类型数组

【代码实现】

public class ArrayQueue {
//最大长度
int maxSize;
//定义一个数组,存储数据
private int[] queue;
//定义对头和队尾标志
private int front;
private int rear;
//初始化一个数组
public void init(int maxSize){
front = -1;
rear = -1;
this.maxSize = maxSize;
this.queue = new int[maxSize];
}
//判断对满
public boolean isFull(){
return rear == maxSize-1;
}
//判断队空
public boolean isEnpty(){
return front == rear;
}
//加入数据,只能从队头加入
public void add(int num){
if(isFull()){
System.out.println("队列满了,插入失败");
return;
}
//要理清楚先后顺序
rear++;
queue[rear] = num;
}
//取数据,只能从队尾取
public int get(){
if(isEnpty()){
System.out.println("队列为空");
//数组初始化之后默认值就是0
return 0;
}
front++;
return queue[front];
}
//查看队头元素
public int showFront(){
if(isEnpty()){
System.out.println("队列为空");
//数组初始化之后默认值就是0
return 0;
}
return queue[front+1];
}
//遍历所有数
public void showAll(){
if(isEnpty()){
System.out.println("队列为空");
//数组初始化之后默认值就是0
return;
}
System.out.println("显示队列:======");
for(int i = front+1; i <= rear; i++){
System.out.println(queue[i]);
}
System.out.println("===============");
}
}

4、代码改进

【代码改进】

使用这个队列,你会觉得很难受,因为你定义了它的长度,它的长度就不能改变了,我们可以设计一个长度可以增加的队列

【设计思路】

当rear==maxSize,即数组满了的时候,我们新建一个数组,比原数组长一倍,然后将原数组的值赋值到新数组

【代码实现】

我们只要修改add方法的代码

public void add(int num){
if(isFull()){
//新建一个长度为原来两倍的数组
int[] newQueue = new int[maxSize*2];
//原数组赋值到新数组
for(int i = front+1; i <= rear; i++){
newQueue[i] = queue[i];
}
rear++;
queue[rear] = num;
return;
}
rear++;
queue[rear] = num;
}

【思考】

其实代码还有很多改进空间

1.比如这里我们写死了只能使用int类型的数组,那么我们能不能将类型像参数一样,在初始化队列的时候再确认呢?这里可以用到泛型知识

2.再比如取数据的时候,当这个数不存在的时候我们返回的是默认值0,能不能不返回0,也能使代码正常结束呢,这里可以用到异常知识

5、数据结构的改进

我们会发现,如果使用这种结构来创建队列,当rear增加到指向分配的连续空间之外时,队列无法再插入新元素,
但这时往往还有大量可用空间未被占用,这些空间是已经出队的队列元素曾经占用过得存储单元。环形队列可以解决这种“假溢出现象”

下一篇环形队列:https://www.cnblogs.com/yxm2020/p/12753564.html

Java数组模拟队列的更多相关文章

  1. Java数组模拟队列 + 优化

    队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则. 即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图)  数组模拟队列 队列本身是有序列表 ...

  2. uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列

    题目很简单,给一个队列以及文件的位置,然后一个一个检查,如果第一个是优先级最高的就打印,否则放到队列后面,求所要打印的文件打印需要花费多长时间. 这里我用数组模拟队列实现,考虑到最糟糕的情况,必须把数 ...

  3. php中数组模拟队列、栈的函数以及数组指针操作

    1,数组指针,current表示当前指针,输出其指向的元素:next表示指针移动到下一个元素:prev指针移动到上一个元素:end表示指针移动到最后一个元素:reset表示指针移动到第一个元素: &l ...

  4. 【Weiss】【第03章】练习3.25:数组模拟队列

    [练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...

  5. Java数组模拟栈

    一.概述 注意:模拟战还可以用链表 二.代码 public class ArrayStack { @Test public void test() { Stack s = new Stack(5); ...

  6. Java数组模拟环形队列

    2.环形队列 (上一篇队列:https://www.cnblogs.com/yxm2020/p/12676323.html) 百度百科 1.假溢出 ​ 系统作为队列用的存储区还没有满,但队列却发生了溢 ...

  7. java数组实现队列

    数组队列 用数组实现的队列,也叫循环队列.就是定义一个数组,用两个下标head,tail表示队头和队尾.当队头和队尾相等时,队列为空.当队尾+1等于队头时,队列为满. 注意tail的值,当插入一个元素 ...

  8. 用java数组模拟登录和注册功能

    package com.linkage.login; import java.util.Scanner; public class user { // 存储用户名和密码 public static S ...

  9. 用java数组模拟购物商城功能与实现

    实体类1(商品): package mall.model; public class goods { private int shoppingID; // 商品编号 private String sh ...

随机推荐

  1. springcloud项目实现自定义权限注解进行接口权限验证

    一般在项目开发中会根据登录人员的权限大小对接口也会设置权限,那么对接口权限是怎么实现的呢,大多数都是用自定义权限注解,只需要在接口上加上一个注解就可以实现对接口的权限拦截,是否对该接口有权调用 接下来 ...

  2. 一文深入了解史上最强的Java堆内缓存框架Caffeine

    它提供了一个近乎最佳的命中率.从性能上秒杀其他一堆进程内缓存框架,Spring5更是为了它放弃了使用多年的GuavaCache 缓存,在我们的日常开发中用的非常多,是我们应对各种性能问题支持高并发的一 ...

  3. 今天对C语言不常用的小东西的了解

    今天又翻了C语言的书,看到const语句,一时间想不起来到底是干嘛的,看语句const   int   a=1;明白了这是一个支持常量指定类型的定义常量的关键字,作用几乎与#define一毛一样,但# ...

  4. LeetCode(不用加号的加法)

    题目: 设计一个函数把两个数相加,不得使用+或者其他算数运算符. 示例: 输入:a=1,b=1 输出:2 提示: a,b均有可能是负数或0 结果不会溢出32位整数 初始思路: 看到题目我就明白只能用位 ...

  5. java -输入年龄判断是否符合范围。

    //创建的一个包名. package demo3; //定义一个类. public class Test { //公共静态的主方法. public static void main(String[] ...

  6. DOTNET CORE源码分析之IOC容器结果获取内容补充

    补充一下ServiceProvider的内容 可能上一篇文章DOTNET CORE源码分析之IServiceProvider.ServiceProvider.IServiceProviderEngin ...

  7. iOS/macOS推荐个高效苹果开发工具, JSON 转模型代码工具,不再为复杂JSON数据写模型而烦恼,支持Swift/Objective-C,极速转换

    CCJSON 是一款运行在macOS上 JSON 转模型代码工具,不再为复杂JSON数据写模型而烦恼,可识别嵌套模型,字典/数组,支持Swift/Objective-C,操作方便,极速转换.下载 效果 ...

  8. HTML节点操作

    HTML节点操作 HTML节点的基本操作,添加节点,替换节点,删除节点,绑定事件,访问子节点,访问父节点,访问兄弟节点. 文档对象模型Document Object Model,简称DOM,是W3C组 ...

  9. 关于PS切图

    现在前端项目中碰到越来越多的图片处理问题,虽然找自己公司UI小哥哥小姐姐可以解决,但是每次都找不仅要看别人有没有时间,更得看人家脸色 唉,自己摸索着来吧(多图,流量党请注意切换WiFi): 通常切图的 ...

  10. C 2015年真题【保】

    1.编写一个完整的程序,使之能完成以下功能:从键盘中输入若干个整数,用链表储存这些输入的数,并要求存储的顺序与输入的顺序相反. 分析:链表建立[头插法] 代码: #include <stdio. ...