package com.qmcheng.queue;

import java.util.Scanner;

/**
 * 使用数组模拟队列
 */
public class ArrayQueueDemo {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入队列大小:");
        int maxSize = scanner.nextInt();
        ArrayQueue queue = new ArrayQueue(maxSize);
        loop: while (true) {
            System.out.println("请输入命令:");
            System.out.println("----------a 添加---------");
            System.out.println("----------p 弹出数据---------");
            System.out.println("----------s 展示数据---------");
            System.out.println("----------q 退出---------");
            String command = scanner.next();
            switch (command) {
                case "a":
                    System.out.println("请输入加入的数字");
                    int data = scanner.nextInt();
                    queue.add(data);
                    break;
                case "p":
                    queue.push();
                    break;
                case "s":
                    queue.show();
                    break;
                case "q":
                    break loop;
                default:
                    System.out.println("找不到命令:"+command+" 请重新输入");
                    break;
            }
        }

    }
}

class ArrayQueue {

    private int maxSize; // 表示数组的最大容量

    private int header; //队列头 指向对列的第一个元素

    private int rear; // 队列尾 指向队列最后一个元素的后一位

    private int[] arr; // 存放队列数据 模拟队列

    public ArrayQueue(int arrMaxSize) {
        maxSize = arrMaxSize;
        arr = new int[maxSize];
        header = 0;
        rear = 0;
    }

    public boolean isEmpty() {
        return header == rear;
    }

    public boolean isFull() {
        return (rear + 1) % maxSize == header;
    }

    public void add(int data) {
        // 添加数据
        if (isFull()) {
            System.out.println("添加失败,队列已经满了");
            return;
        }
        System.out.println("加入数据:"+ data);
        arr[rear] = data;
        rear = (rear + 1) % maxSize;
    }

    public void push() {
        // 弹出数据
        if (isEmpty()) {
            System.out.println("队列是空的");
            return;
        }
        System.out.println("弹出头部数据:"+ arr[header]);
        arr[header] = 0;
        header = (header + 1) % maxSize;
    }

    public void show() {
        // 展示队列所有数据
        if (isEmpty()) {
            System.out.println("队列是空的");
            return;
        }

        int headerTemp = header;
        while (headerTemp != rear) {
            System.out.printf("arr[%d]:%d \n", headerTemp, arr[headerTemp]);
            headerTemp = (headerTemp + 1) % maxSize;
        }
    }
    
}