Java数据结构与算法(一)数组模拟队列

Java数据结构与算法(一)数组模拟队列

前言

在Java基础的学习过程中,我觉得学得最痛苦的一部分内容就是数据结构与算法,因为它太抽象了,例如一些什么队列、栈、链表、排序算法等,所以我在写数据结构和算法的时候经常要自己拿纸和笔手动去模拟过程,这样可以加深自己的理解。而且在写好去运行的时候,我会逐步进行Debug去查看运行过程,观察和我所想的是否一致。

那么接下来我就开始分享我自己学习这门课程的一些小心得,会通过画图的方式来展示!

队列的基本认识

数据结构与算法中的队列其实和我们现实生活中的队列是一样的,它遵循先入先出的原则,就像我们去饭堂排队买饭吃,先到的先买,买完之后就退出队列。那么运用到我们抽象的数据结构中,队列的特点就可以表现为先存入队列的数据,要先取出。后存入的要后取出存入队列的数据。队列是一个有序列表,可以采用数组或者链表来实现,那么这篇文章先用数组来实现以下,链表实现等后面讲到链表的时候再回头来实现一次!

数组模拟队列

使用数组模拟队列,首先来看一个示意图,如下图所示。图中有三条队列,分别是三种不同的情况,可以看出在队列的坐标都有一些下标,这些下标其实就是数组的下标。在队列的右边有两个指针,分别为rear、front,rear和front默认都是-1。rear是随着数据的输入而改变的,指向队列的尾部,当往队列中加入一个数据的时候,rear + 1;而front会随数据的输出而改变,指向队列的头部的前一个位置,当有数据出队列的时候,front + 1。

如下图假如数据的大小MaxSize为4,当往队列中加入4个数据后,此时队列已满,那么rear就指到数组的最后一个下标3。而因为此时还没有进行处队列操作,所以front还是-1.那么再看最右边的图,此时队列只剩两个数据,也就意味着队列中出了两个数据,那么front就会上移。

image-20200625084941957

下面就开始是使用代码来实现数组模拟队列:

  • 首先判断队列是否满或者是否为空,这其实很简单,当rear = front的时候队列就为空了,因为它们默认都为-1,而如果它们相等的话就表示没有数据加入,所以队列就为空;当rear = maxSize - 1的时候队列就满了,因为每加入一个数据rear就要+1。
public class ArrayQueue {
    private int maxSize;//数组的最大容量
    private int front;//队列头
    private int rear;//队列尾
    private int[] arr;//该数组用于存放数据,模拟队列

    //队列的构造器,传入队列的长度
    public ArrayQueue(int arrMaxSize) {
        maxSize = arrMaxSize;
        arr = new int[maxSize];
        front = -1;//指向队列头部,front是指向队列头的前一个位置
        rear = -1;//指向队列尾部
    }

    //判断队列是否满
    public boolean isFull(){
        return rear == maxSize-1;
    }

    //判断队列是否为空
    public boolean isEmpty(){
        return rear == front;
    }
}
  • 接下来写将数据添加到队列的方法,按照前面的分析,将新的数据加入队列的时候rear要+1,同时要将加入的数据加进数组中。但是加入之前首先要判断队列是否满了,直接调用前面写的方法就行了。
//添加数据到队列
public void addQueue(int n){
    //判断队列是否满
    if (isFull()){
        System.out.println("队列已满,不能加入数据");
        return;
    }
    rear++;//让rear后移
    arr[rear] = n;
}
  • 进队列的方法已经写好了,现在要写出队列的方法,前面也分析到了,出队列的时候front要+1,那么这个方法我还想要获取出队列的数据,所以方法是int返回类型的,方法最后返回被front指针指向的数。但是注意出队列要先判断队列是否为空,该方法前面有写,如果为空就不同出了,直接结束方法。
//获取队列的数据,出队列
public int getQueue(){
    //判断队列是否为空
    if (isEmpty()){
        throw new RuntimeException("队列为空,不能去数据!");
    }
    front++;//让front后移
    return arr[front];//返回出队列的数据
}
  • 如果想要查看整条队列的数据情况,我们还需要一个打印整个队列的方法,这个方法的实现很简单,就直接写个循环就行了。这里也作了一个判断,当队列为空的时候就不作任何事情,直接结束方法。
//显示队列所有数据
public void showQueue(){
    if (isEmpty()){
        System.out.println("队列为空,没有数据");
        return;
    }
    for (int i = 0; i < arr.length; i++) {
        System.out.printf("arr[%d]=%d\n",i,arr[i]);
    }
}
  • 我们通常还需要查看队列的头数据,而front是指向头部的前一个位置,所以我们借用front来取数据即可,前提也是要先做一个空判断。
//显示队列的头数据
public int headQueue(){
    //判断是否为空
    if (isEmpty()){
        throw new RuntimeException("队列为空,没有数据");
    }
    return arr[front+1];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值