数组实现队列(详细)

       我们都知道,队列是一种先进先出的数据结构,每当有人问你队列是什么,你的回答就是 "一种先进先出的数据结构",当然这样的回答也是完全没有错的,它就是一种先进先出的数据结构,为什么我们不能描述的多一点呢?更详细一点?下面我们就来详细的描述一下队列。

       队列是我们学习数据结构的一种重要的结构,它能帮我们帮我们解决生活中的一些问题,例如到银行办理业务,当人多的时候就需要取号排队,这就是队列的一种应用。队列的实现可以有两种方式来实现,一是用数组,二是链表,在这里我们就来说一下数组实现的方式,链表的实现方式我会在后续的更新中发出来。

     下面我会先用图文的方式来描述队列到底是一个什么东西,以及它是怎么先进先出的,然后会说明一下怎么用代码去自己实现。

    我们都知道队列是一种先进先出的数据结构,怎么个先进先出法?

    首先,我们拥有一个数组,数组应当有这三个属性,头指针,尾指针,和长度。头指针应当指向队列的头一个元素,当从队列里面取出一个元素后,应当将它向后移一个位置,尾指针当有一个元素进来后也向后移一个位置。

首先一个初始的队列应该是这样的:

队头指针和队尾指针都在第一个位置,也表示这是一个空队列。

这时假如我们入队一个元素 1:

这时队列的头指针不变,队尾向后移动一次。

再入队一个元素 2:

这时候出队一个元素:

这时候对头指针向后移动,队尾指针不变。

以上就是队列的基本操作,入队出队的具体过程,你理解了嘛?

其实基本操作看起来比较简单,但是利用代码来完成这个过程还是有一定难度的。

我们在用代码实现的时候还要考虑许多问题,比如说我们怎么判断队列是空的还是满的,队列中有几个元素,还有就是当队尾指针到达数组的尾部之后怎么走?

这些问题都是我们需要考虑的。

下面我就展示一下代码:

定义我们需要的四个属性

    private int maxSize; //数组长度
    private int front;  //对头指针
    private int real;   //队尾指针
    private int[] arr;  //数组
    //初始化  构造器
    public myQueue(int maxSize){
        this.maxSize = maxSize;
        arr = new int[maxSize];
    }

判断队列是否满了:当队尾指针加一等于队头指针就队满了。

这里我们需要考虑到的因素是当队尾指针比队头指针小的情况。

 public boolean isFull(){
        return (real+1)%maxSize == front;  //最后一个位置没用到
    }

判断队列是否为空:

public boolean isEmpty(){
        return front == real;
    }

添加元素

尾指针不能光顾着加啊,还要考虑到到达尾部之后要走到数组的前面去啊。

public void Add(int n){
        if(isFull()){
            System.out.println("队满");
            return;
        }
        arr[real] = n;
        real = (real+1)%maxSize;
    }

出队:

public int OutQueue(){
        if(isEmpty()){
            throw new RuntimeException("队列为空!");
        }
        int temp = arr[front];
        front = (front+1)%maxSize;
        return temp;
    }

查看队头元素:

//查看队列的第一个元素
    public int HeadNum(){
        if(isEmpty()){
            throw new RuntimeException("队列为空!");
        }
        return arr[front];
    }

查看队列中有效元素的个数:

  public int CountQueue(){
        if(isEmpty()){
            return 0;
        }
        return (real+maxSize-front)%maxSize;
    }

显示队列所有元素:

 //显示队列的所有数据
    public void ShowQueue(){
        if(isEmpty()){
            System.out.println("队列中没有数据");
            return;
        }
        for(int i = front;i < front+CountQueue();i++){
            System.out.println(arr[i%maxSize]);
        }
    }

本文中有几个需要注意的公式,就是判断队列是否满了:

(real+1)%maxSize == front

还要就是队尾指针和队头指针移动的操作:

real = (real+1)%maxSize;

查看队列中有效元素的个数:

(real+maxSize-front)%maxSize

还有就是遍历队列:

for(int i = front;i < front+CountQueue();i++){
    System.out.println(arr[i%maxSize]);
}

这些都是需要仔细想一下的地方,还请花点时间理解一下!


版权声明:本文为xhl1123456789原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。