数据结构3——数组模拟环形队列

102 阅读1分钟

import java.util.Scanner;
//将数组想象为环形,超出数组长度的下标取模
public class 数组实现环形队列 {
    public static void main(String[] args) {
//        队列有效数据最大为2 需要空出一位判断rare和front的关系去确定队列是否为空或满
        ArrayQueue arrayQueue = new ArrayQueue(3); 
        char key = ' ';
        Scanner in = new Scanner(System.in);
        boolean loop = true;
        System.out.println("s:显示队列");
        System.out.println("a:添加数据");
        System.out.println("g:取出数据");
        System.out.println("t:得到数据个数");
        System.out.println("e:退出");
        while(loop){
            key = in.next().charAt(0);
            switch (key){
                case 's':
                    arrayQueue.showArr();
                    break;
                case 'a':
                    System.out.println("输入一个数");
                    int n = in.nextInt();
                    arrayQueue.add(n);
                    break;
                case 'g':
                    try {
                        int res = arrayQueue.get();
                        System.out.println("取出:" + res);
                    }catch (Exception e){
                        System.out.println(e);
                    }
                    break;
                case 't':
                    System.out.println("数据个数" + arrayQueue.total());
                    break;
                case 'e':
                    loop = false;
                    break;
            }

        }
        System.out.println("结束");
    }
}

class ArrayQueue{
    //    数组最大容量
    private int maxSize;
    //    指向队列第一个数据
    private int front;
    //    队列最后一个数据的后一位,这一位会随着数据加入和取出而动态变化
    private int rare;
    //    存放数据模拟队列,空出一位用来判断
    private int [] arr;
    public ArrayQueue(int arrMaxSize){
        maxSize = arrMaxSize;
        arr = new int[maxSize];
        front = 0;
        rare = 0;
    }
    public boolean isFull(){
//        当rare指向front后的位置时,队列满
        return (rare + 1) % maxSize == front;
    }
    public boolean isEmpty(){
//        当rare和front指向的位置相同,队列空
        return rare == front;
    }
    public void add(int n){
        if (isFull()){
            System.out.println("队列满,无法添加");
            return;
        }
//        直接向队列后一位赋值
        arr[rare] = n;
//        增加一个数据,rare需要指向这个数据的后一位
        rare = (rare + 1) % maxSize;
    }
    public int get(){
        if (isEmpty()){
            throw new RuntimeException("队列空,无法取出");
        }
//        获取队列头数据
        int value = arr[front];
//        取出一个数据,front向后移一位
        front = (front + 1) % maxSize;
        return value;
    }
    public void showArr(){
        if (isEmpty()){
            System.out.println("无数据");
            return;
        }
        for (int i = front; i < rare; i++) {
            System.out.println(arr[i]);
        }
    }
    public int total(){
        return (rare + maxSize - front) % maxSize;
    }
}