数组模拟队列

数组模拟队列

今天学习数组模拟队列。队列常用于生活中的方方面面。比如银行叫号排队。实际上就是队列。所有人抽号排队。先去的先抽号。所以靠前的号最后会先被叫到然后出队。后边的会随之往前移位。也就是队伍中的顺序会发生变化。

实际上用数组很容易模拟出来队列。

队列的几大要素。队列长度(MaxSize) 队列头部的前一个位置front,队列的尾部rear,还有我们的数组arr[]。我们需要创建Queue类来模拟队列。

package com.joseph.sparseArray;

public class ArrayQueue {
    public static void main(String[] args) {
        Queue queue = new Queue(3);
        System.out.println("数组模拟队列长度为:" + queue.arr.length + ",MaxSize = " + queue.MaxSize);
        queue.addQueue(10);
        queue.List();
        System.out.println("rear:" + queue.rear);
        System.out.println("front" + queue.front);
        System.out.println("头数据:" + queue.arr[queue.front + 1]);
        System.out.println("队尾数据:" + queue.arr[queue.rear]);
        System.out.println("---------------------------------------------------------------------");
        queue.addQueue(20);
        queue.List();
        System.out.println("rear:" + queue.rear);
        System.out.println("front" + queue.front);
        System.out.println("头数据:" + queue.arr[queue.front + 1]);
        System.out.println("队尾数据:" + queue.arr[queue.rear]);
        System.out.println("---------------------------------------------------------------------");
        queue.getQueue();
        queue.List();
        System.out.println("rear:" + queue.rear);
        System.out.println("front" + queue.front);
        System.out.println("头数据:" + queue.arr[queue.front + 1]);
        System.out.println("队尾数据:" + queue.arr[queue.rear]);
        System.out.println("---------------------------------------------------------------------");
        queue.addQueue(40);
        queue.List();
        System.out.println("rear:" + queue.rear);
        System.out.println("front" + queue.front);
        System.out.println("头数据:" + queue.arr[queue.front + 1]);
        System.out.println("队尾数据:" + queue.arr[queue.rear]);
    }
}
class Queue{
     int MaxSize ;
     int rear ;
     int front ;
    int arr[] ;
    public Queue(int MaxSize) {
        this.MaxSize = MaxSize ;
        arr = new int[MaxSize];
        this.rear = -1;
        this.front = -1;
    }
    public boolean isFull(){
        return rear == MaxSize -1 ;
    }
    public boolean isEmpty(){
        return rear == front ;
    }
    public void addQueue(int key){
        //判断是否已满
        if(isFull()){
            System.out.println("QUEUE IS FULL!");
            return ;
        }
        //没满
        this.rear ++ ;
        arr[rear] = key ;
        if(arr[rear] == key){
            System.out.println("添加成功!");
        }else{
            System.out.println("添加失败!");
        }
    }
    public int getQueue(){
        //判断为空
        if(isEmpty()){
           throw new RuntimeException("QUEUE IS EMPTY");
        }
        //不为空
        this.front ++ ;
        return arr[front];

    }
    public void List(){
        //判断
        if(isEmpty()){
            System.out.println("QUEUE IS EMPTY!");
            return ;
        }
        for(int i = 0 ; i < arr.length ; i ++){
            System.out.printf("arr[%d] = %d\n",i,arr[i]);
        }
    }
}
/**
 * @author JosephWang
 * @date 2021/8/9 17:18
 */

注意:

心系的小伙伴已经发现了我们的瑕疵。这个数组模拟队列已经完成了。但是数组是一次性的。我们发现当数组满了或者没满。队列的头和尾使用我们的rear和front来指向的。而取出数据后的下标将被弃用。导致浪费。我们下期将优化这种浪费。

版权声明:本文为F-Fan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/F-Fan/p/15120099.html