欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构之数组模拟环形队列(Java实现)

程序员文章站 2022-03-12 23:04:07
...
分析说明:
1) 尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定,这个在做判断队列满的
时候需要注意 (rear + 1) % maxSize == front ]
2) rear == front []
3) 分析示意图:
数据结构之数组模拟环形队列(Java实现)
 
代码实现
 
package com.zhenghuan.queue;
/*
front变量:指向队列的第一个元素,即arr[front]为队列的第一个元素,front的初始值为0;
rear变量:指向队列最后一个元素的后一个位置
判断满:(rear+1)%maxsize=front
判断空:rear=front
队列中有效数据的个数:(rear+maxsize-front)%maxsize     rear=1 max=0
 */

import java.util.Scanner;

public class CircleArrayAueueDemo {
    public static void main(String[] args) {
        //测试一把
        //创建一个队列
        CircleArray arrayQueue=new CircleArray(4);//其队列有效数据最大是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("g(get);从队列取出数据");
            System.out.println("h(head);查看队列头数据");
            key=scanner.next().charAt(0);//接受一个字符
            switch (key){
                case 's':arrayQueue.showQueue();
                    break;
                case 'a':
                    System.out.println("请输入一个数:");
                    int value=scanner.nextInt();
                    arrayQueue.addQueue(value);
                    break;
                case 'g':try {
                    int res=arrayQueue.getQueue();
                    System.out.printf("取出的数据是%d\n",res);
                }catch (Exception e){
                    System.out.println(e.getMessage());
                }
                    break;
                case 'h':try {
                    int res=arrayQueue.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 CircleArray{
    private int maxsize;//表示数组最大容量
    private int front;
    //front变量:指向队列的第一个元素,即arr[front]为队列的第一个元素,
    // front的初始值为0;
    private int rear;
    //rear变量:指向队列最后一个元素的后一个位置
    // rear的初始值为0;
    private int[] arr;//该数组用于存放数据,模拟队列

    public CircleArray(int arrMaxSize){
        maxsize=arrMaxSize;
        arr=new int[maxsize];
        front=0;rear=0;
    }
    public boolean isFull(){//判断队列是否满了
        return (rear+1)%maxsize==front;
    }
    public boolean isEmpty(){//判断是否为空
        return rear==front;
    }
    public void addQueue(int n){//添加数据
        if (isFull())
            throw new RuntimeException("环形队列已满,无法加入");
        //arr[rear++]=n;   这样不严谨,rear必须取模
        arr[rear]=n;
        rear=(rear+1)%maxsize;
    }
    public int getQueue(){
        if (isEmpty())
            throw new RuntimeException("环形队列为空,无法取出");
        /*
        这里需要分析出front是指向队列第一个元素
        ①将front对应值保存到临时变量 ②将front后移 ③返回临时保存的变量
         */
        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("环形队列为空,无法取出");
        else {
            //从front开始遍历,确定遍历maxsize个元素
            for (int i=front;i<front+Size();i++){
                System.out.printf("arr[%d]=%d\t",i%maxsize,arr[i%maxsize]);
            }
        }

    }
    public int headQueue(){
        if (isEmpty())
            throw new RuntimeException("环形队列为空,无法取出");
        return arr[front];
    }
}
相关标签: java