队列的思想及实现简单案例—java版

(示意图)

关于队列,首先要知道队列的特点     

      1)队列是一个有序列表,可以用数组或链表来实现,本章用数组实现

      2)遵循先进先出的原则,既:先存入的数据先取出,后存入的数据后取出

     3)示意图(上图)

所以,首先要创建队列,并初始化其属性

class aQueue{
    private int maxSize;//队列的最大容量
    private int rear;//队列尾
    private int front;//队列头
    private int[] arr;//数组本身

    public aQueue(int arrMaxSize){
        maxSize = arrMaxSize;
        front = -1;//指向队列头部,分析出front是指向队列头的前一个位置
        rear = -1;//指向队列尾,指向队列尾的数据本身(即就是队列最后一个数据)
        arr = new int[maxSize];
    }
}

有一个问题→为什么front和rear都指向-1呢,可以换种方法理解,在编程语言里,通常都用0作为某个存储体的第一个元素,比如java数组arr[0]表示第一个数,所以这里队头和队尾都指向-1,表示还没有数据

初始化完队列,接下来就要其中的几个重要方法了

    //判断队列是否为空
    public boolean isEmpty(){
        return front == rear;
    }
    //判断队列是否满
    public boolean isFull(){
        return rear== (maxSize - 1);
    }
    //入队
    public void setQueue(int value){
        if (isFull()){
            System.out.println("队列已满,不能入队!");
            return;
        }
        rear++;
        arr[rear] = value;
        //也可以用一步实现 arr[++rear] = value;
    }
    //出队
    public int outQueue(){
        if (isEmpty()){
            throw new RuntimeException("队列空,不能取数据!");
        }
        return arr[++front];
    }

这里解释几个问题

1. 为什么判断为空的条件是 front == rear?

    可以根据最上面的示意图来看,当入队时,队尾(rear)指向的是当前元素,假设入队4个元素,出队4个元素,当所有全部出队的时候,恰好rear == front。

2.判断队满的条件为 rear = maxSize - 1

    rear指向的是当前元素,而队列是从0到maxSize -1,当rear指向maxSize-1,也就指向了队列最后一个元素了,此时队满

3.入队要实现rear++, arr[rear] = value;

    在入队方法里,先判断是否为空,如果不为空,执行rear++, arr[rear] = value; 先让队尾指针+1,再存入数据,换句话说,入队的时候要把新进来的数据存放到当前rear指向的位置的下一个位置,所以要让rear先加1,再把数据存入

问题分析并优化

1)目前数组使用一次就不能用,没有达到复用的效果

2)这个数组使用算法,该进程一个环形队列,算法的关键是取模,具体问题将在下章更新

最后,附上简单小源码

package com.queue;

public class ArrayQueue {
    public static void main(String[] args) {
         aQueue a = new aQueue(5);
         a.setQueue(10);
         a.setQueue(20);
         a.setQueue(30);
         a.setQueue(40);
         a.setQueue(50);
        System.out.println(a.outQueue());
        System.out.println(a.outQueue());
        System.out.println("队头为:" + a.headQueue());
    }
}
class aQueue{
    private int maxSize;//队列的最大容量
    private int rear;//队列尾
    private int front;//队列头
    private int[] arr;//数组本身
    public aQueue(int arrMaxSize){
        maxSize = arrMaxSize;
        front = -1;//指向队列头部,分析出front是指向队列头的前一个位置
        rear = -1;//指向队列尾,指向队列尾的数据本身(即就是队列最后一个数据)
        arr = new int[maxSize];
    }
    //判断队列是否为空
    public boolean isEmpty(){
        return front == rear;
    }
    //判断队列是否满
    public boolean isFull(){
        return rear== (maxSize - 1);
    }
    //入队
    public void setQueue(int value){
        if (isFull()){
            System.out.println("队列已满,不能入队!");
            return;
        }
        arr[++rear] = value;
    }
    //出队
    public int outQueue(){
        if (isEmpty()){
            throw new RuntimeException("队列空,不能取数据!");
        }
        return arr[++front];
    }
    //查看头数据
    public int headQueue(){
        if (isEmpty()){
            throw new RuntimeException("队列为空");
        }
        return arr[front+1];
    }
}

有什么问题欢迎在下方留言,侵删。


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