数组模拟队列

我们先来回顾下什么是队列数据结构:

  

  1. 队列是一种先进先出,后进后出的线性表
  2. 加数据是在队列的尾部加,取数据是在队列的头部取
  3. 队列只允许在后端(称为rear )进行插入操作,在前端(称为front )进行删除操作
  4. 队列满的情况:尾结点read 等于 MaxSize-1

 

分析:

  

定义数组类 ArrayQueue:

  private int maxSize;//数组的最大容量
    private int front;//头结点
    private int read;//尾结点
    private int[] arr;//创建数组用于存放数据,模拟队列

无参构造初始化队列:

/**
* 构造方法
* @param arrMaxSize 队列能够拥有的最大容量
*/
public ArrayQueue(int arrMaxSize){
maxSize = arrMaxSize;//传入数据表示队列能够拥有的最大容量
arr = new int[maxSize];//初始化数组
front = -1;//指向队列头结点的前一个位置
read = -1;//指向的是队列的尾结点(就是队列的最后一个数据)
}

队列满:

/**
* 判断队列是否满了,判断队列是否满的条件是:尾结点==队列最大容量-1
* @return
*/
public boolean isFull(){
return read == maxSize-1;
}

队列空:

/**
* 判断队列是否为空
* @return
*/
public boolean isAir(){
return front == read;
}

添加数据:

/**
* 添加数据到队列
* @param data:添加的数据
*/
public void add(int data){
//先判断队列是否满
if (isFull()){
System.out.println("队列已满,不能加入数据!");
return;
}
read++;//先让尾结点后移
arr[read] = data;
}

出队列(取数据):

/**
* 获取队列的数据,出队列
* @return
*/
public int get(){
//先判断队列是否为空
if (isAir()){
//通过抛出异常来解决
throw new RuntimeException("队列空,不能取数据!");
}
front++;//让头结点后移一位
return arr[front];
}

打印队列:

/**
* 打印数据,就是遍历arr数组
*/
public void listQueue(){
//判断队列是否为空
if (isAir()){
System.out.println("队列为空,没有数据!");
}
for (int i=0;i<arr.length;i++){
System.out.println("arr["+i+"]="+arr[i]);
}
}

显示队头数据:

/**
* 显示队列的头数据
*/
public int headQueue(){
if (isAir()){
throw new RuntimeException("队列是空的没有数据");
}
return arr[front+1];//+1是因为头结点指向的是队列的前一个数据
}

 完整代码:

public class Test02_数组模拟队列 {
    public static void main(String[] args) {
        ArrayQueue queue = new ArrayQueue(3);
        char value = ' ';
        Scanner s = new Scanner(System.in);
        boolean loop = true;
        while (loop){
            System.out.println("==================================");
            System.out.println("s(show):显示队列");
            System.out.println("e(exit):退出程序" );
            System.out.println("a(add):添加数据到队列");
            System.out.println("g(get):从队列取出数据");
            System.out.println("h(head):查看队列头的数据");
            System.out.println("==================================");
            //接受用户输入的一个字符
            System.out.print("请输入指令:");
            value = s.next().charAt(0);
            switch (value){
                case 's'://显示队列
                    queue.listQueue();
                    break;
                case  'g'://取数据
                        System.out.println("取出的数据是:"+queue.get());
                    break;
                case 'a'://添加数据
                    System.out.print("请输入一个数:");
                    int index = s.nextInt();
                    queue.add(index);
                    break;
                case 'h'://查看队列头
                    System.out.println("队列的头是:"+queue.headQueue());
                    break;
                case 'e'://退出程序
                    loop = false;
                    break;
                default:
                    System.out.println("您好,您输入的字符不合法,请重新输入!");
                    break;
            }
        }
        System.out.println("您已经成功退出!");
    }
}
//用数组模拟队列
class ArrayQueue{
    private int maxSize;//数组的最大容量
    private int front;//头结点
    private int read;//尾结点
    private int[] arr;//创建数组用于存放数据,模拟队列

    /**
     * 构造方法
     * @param arrMaxSize 队列能够拥有的最大容量
     */
    public ArrayQueue(int arrMaxSize){
        maxSize = arrMaxSize;//传入数据表示队列能够拥有的最大容量
        arr = new int[maxSize];//初始化数组
        front = -1;//指向队列头结点的前一个位置
        read = -1;//指向的是队列的尾结点(就是队列的最后一个数据)
    }

    /**
     * 判断队列是否满了,判断队列是否满的条件是:尾结点==队列最大容量-1
     * @return
     */
    public boolean isFull(){
        return read == maxSize-1;
    }

    /**
     * 判断队列是否为空
     * @return
     */
    public boolean isAir(){
        return front == read;
    }

    /**
     * 添加数据到队列
     * @param data:添加的数据
     */
    public void add(int data){
        //先判断队列是否满
        if (isFull()){
            System.out.println("队列已满,不能加入数据!");
            return;
        }
        read++;//先让尾结点后移
        arr[read] = data;
    }

    /**
     * 获取队列的数据,出队列
     * @return
     */
    public int get(){
        //先判断队列是否为空
        if (isAir()){
            //通过抛出异常来解决
            throw new RuntimeException("队列空,不能取数据!");
        }
        front++;//让头结点后移一位
        return arr[front];
    }
    /**
     * 打印数据,就是遍历arr数组
     */
    public void listQueue(){
        //判断队列是否为空
        if (isAir()){
            System.out.println("队列为空,没有数据!");
        }
        for (int i=0;i<arr.length;i++){
            System.out.println("arr["+i+"]="+arr[i]);
        }
    }
    /**
     * 显示队列的头数据
     */
    public int headQueue(){
        if (isAir()){
            throw new RuntimeException("队列是空的没有数据");
        }
        return arr[front+1];//+1是因为头结点指向的是队列的前一个数据
    }
}

 

posted @ 2020-08-15 15:57  Java小白的搬砖路  阅读(139)  评论(0编辑  收藏  举报