环形队列(数组实现)

import java.util.Scanner;

public class CircleArrayDemo {
    public static void main(String[] args) {
        CircleArray queue=new CircleArray(3);
        boolean loop=true;
        char choose=' ';//接收用户选项
        //创建输入流
        Scanner scanner = new Scanner(System.in);
        while(loop){
            System.out.println("s(显示队列数据)");
            System.out.println("a(添加队列数据)");
            System.out.println("g(出队)");
            System.out.println("h(队首数据)");
            System.out.println("e(退出))");
            choose = scanner.next().charAt(0);
            switch (choose){
                case 's':
                    queue.showQueue();
                    break;
                case 'a':
                    System.out.println("请输入数据:");
                    int n=scanner.nextInt();
                    queue.addQueue(n);
                    break;
                case 'g':
                    System.out.println("取出的数据是:"+queue.getQueue());
                    break;
                case 'h':
                    System.out.println("队首数据是:"+queue.headQueue());
                    break;
                case 'e':
                    System.out.println("欢迎下次使用~");
                    break;
                    default:
                        System.out.println("输入错误,请重新输入");
            }
        }
    }
}
class CircleArray{
    private int maxSize;//最大容量
    //环形队列,front含义调整,front指向队列第一个元素,初始值为0;
    private int front;
    //环形队列,rear含义调整,rear指向最后元素的后一个位置,因为希望空出一个位置判断队满!
    private int rear;
    private int[] arr;//数组模拟队列

    public CircleArray(int maxSize){
        this.maxSize=maxSize;
        arr=new int[maxSize];
    }

    //环形队列判断队列满!
    public  boolean isFull(){
        return (rear+1)%maxSize==front;
    }

    //判断队列空
    public boolean isEmpty(){
        return front==rear;
    }

    //添加数据
    public void addQueue(int n){
        //判断队满?
        if (isFull()){
            System.out.println("队列已满,不能添加数据~");
            return;
        }
        //加入数据
        arr[rear]=n;
        //环形队列!rear变换规律:取模运算
        rear=(rear+1)%maxSize;
    }

    //出队
    public int getQueue(){
        //判断对队空
        if (isEmpty()){
            throw new RuntimeException("队列空,不能取数据~");
        }
        int value=arr[front];
        front=(front+1)%maxSize;
        return value;
    }

    //统计队列有效数据个数
    public int size(){
        return (rear+maxSize-front)%maxSize;
    }
    //显示队列所有数据
    public void showQueue(){
        //遍历数组
        if (isEmpty()){
            System.out.println("队列空,没有数据~");
            return;
        }
        //环形队列!从front开始遍历,到front+size(),索引取模!
        for(int i=front;i<front+size();i++){
            System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);        }
    }
    //显示队列头数据
    public int headQueue(){
        if (isEmpty()){
            throw new RuntimeException("队列为空,没有数据~");
        }
        return arr[front];
    }

}

你可能感兴趣的:(Java数据结构)