数组模拟循环队列(java实现)

1.front变量的含义:front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素front的初始值=0。

 

2.rear变量的含义:rear指向队列的最后一个元素的后一个位置.因为希望空出一个空间做为预留空间。 rear的初始值=0。

 

3.当队列满时,条件是(rear +1)%maxsize=front【满】。

 

4.对队列为空的条件,rear==front空。

 

5.当我们这样分析,队列中有效的数据的个数(rear+ maxsize-front)%maxsize

 
public class CircleArrayQueue {
    public static void main(String[] args) {
        System.out.println("测试数组模拟环形队列");
        circlearrqueue aq=new circlearrqueue(3);
        char key=' ';//接收用户输入
        Scanner scanner =new Scanner(System.in);
        boolean loop=true;
        //输出有个菜单
        while(loop){
            System.out.println("s(show):显示队列");
            System.out.println("e(exit):退出程序");
            System.out.println("a(add):添加数据到队列");
            System.out.println("h(ehead):查看队列头的数据 ");
            System.out.println("g(get):取出队列头的数据 ");
            key=scanner.next().charAt(0);//接受一个字符
            switch (key){
                case 's':
                    aq.showQueue();
                    break;
                case 'a':
                    System.out.println("输出一个数");
                    int value=scanner.nextInt();
                    aq.addQueue(value);
                    break;
                case 'g':
                    try{
                        int res=aq.getQueue();
                        System.out.printf("取出的数据是%d\n",res);
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h'://查看队列头的数据
                    try{
                        int res =aq.headQueue();
                        System.out.printf("队列头的数据是%d\n",res);
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e'://退出
                    scanner.close();
                    loop=false;
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出");
    }
}

class circlearrqueue{
    private int maxsize;//表示队列的长度
    private int front;//队列头
    private int rear;//队列尾
    private int[] arr;//该数组用于存放数据
    public circlearrqueue(int arrMaxSize){
        maxsize = arrMaxSize;
        arr = new int[maxsize];
    }
    public boolean isFull(){
        return (rear+1)%maxsize==front;
    }
    public boolean isEmpty(){
        return rear==front;
    }
    public void addQueue(int n){
        //判断队列是否为满
        if(isFull()){
            System.out.println("队列满 ,不能加入");
            return;
        }
        arr[rear]=n;//直接将数据添加
        rear=(rear+1)%maxsize;
    }

    public int getQueue(){
        //判断队列是否为空
        if(isEmpty()){
            //通过抛出异常
            throw new RuntimeException("队列空,不能取数据");
        }
        //这里需要分析front是指向队列的第一个元素
        //1.先把front的值保留到临时变量 2.将front后移 3.将临时变量的值返回
        int value=arr[front];
        front=(front+1)%maxsize;
        return value;
    }
    public void showQueue(){
        //遍历
        if(isEmpty()){
            System.out.println("队列为空,没有数据");
            return;
        }
        //从front开始遍历,遍历多少个元素?
        for(int i=front;i<front+size();i++){
            System.out.printf("arr[%d]=%d\n",i%maxsize,arr[i%maxsize]);
        }
    }
    //求出当前数列有效个数
    public int size(){
        return (rear+maxsize-front)%maxsize;
    }
    public int headQueue(){
        //判断
        if(isEmpty()){
            throw new RuntimeException("队列为空,没有数据");
        }
        return arr[front];
    }

}

猜你喜欢

转载自www.cnblogs.com/GEMyd/p/11647253.html