Bootstrap

用数组模拟队列-1

队列是一种有序列表,可用数组或链表来实现

队列的特点:先进先出

应用场景:银行排队叫号场景

队尾:rear,指向队列尾的数据(即包含队列的最后一个数据)

对头:front,指向队列的前一个位置

队列的最大容量:maxSize

出队时front发生改变,入队时rear发生改变

判断队列是否为空:rear==front

判断队列是否为满:rear==maxSize-1

代码实现:

@Test
public  void arrayQueue() {
    //创建一个队列
   ArrayQueue queue= new ArrayQueue(3);
   char key=' ';//接受用户输入
    Scanner scanner=new Scanner(System.in);
    boolean loop=true;
    //输出一个菜单
    while(loop){
        System.out.println("s(show):显示队列");
        System.out.println("s(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':
                queue.showQueue();
                break;
            case'a':
                System.out.println("请输入一个数据");
                int value=scanner.nextInt();
                queue.addQueue(value);
                break;
            case'g'://取出数据
                try{
                    int res=queue.getQueue();
                    System.out.printf("取出的数据是%d\n",res);
                }catch(Exception e){
                    System.out.println(e.getMessage());
                }
                break;
            case'h'://查看队列头的数据
                try{
                    int res=queue.getQueue();
                    System.out.printf("队列头的数据是",res);
                }catch(Exception e){
                    System.out.println(e.getMessage());
                }
                break;
            case'e'://退出
                scanner.close();
                loop=false;
                break;

            default:
                break;
        }
     System.out.println("程序退出");
    }

}
//使用数组模拟队列编写一个ArrayQueue类
class ArrayQueue {
    private int maxSize;//表示数组的最大容量
    private int front;//队列头

    private int rear;//队列尾
    private int[] arr;//该数组用于存放数据,模拟队列

    //创建队列的构造器
    public ArrayQueue(int arrMaxSize) {
        maxSize = arrMaxSize;
        arr = new int[maxSize];
        front = -1;//指向队列头部,分析出front是指向队列头的前一个位置

        rear = -1;//指向队列尾,指向队列尾的数据(即就是队列最后一个数据)

    }

    //判断队列是否满
    public boolean isFull() {
        return rear==maxSize-1;

    }
    //判断队列是否为空
    public boolean isEmpty(){
        return rear==front;
    }
    //添加数列到队列
    public void addQueue(int n){
        //判断队列是否满
        if(isFull()){
            System.out.println("队列满,不能加入数据");
            return;
        }
        rear++;//让rear后移
        arr[rear]=n;
    }
    //出队列
    public int getQueue(){
        //判断队列是否为空,会报数组越界
        if(isEmpty()){
            //通过抛出异常来处理
            throw new RuntimeException("队列空,不能取数据");

        }
        front++;
        return arr[front];

    }
    //显示队列的所有数据
    public void showQueue(){
        //遍历
        if(isEmpty()){
            System.out.println("队列为空,没有数据");
            return;
        }
        for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }
    }
    //显示队列的头数据,注意不是取出数据
    public int headQueue(){
        //判断
        if(isEmpty()){
            System.out.println("队列为空,没有数据");
        }
        return arr[front+1];
    }
}

 但是这种实现方式会出现假溢出的现象,造成资源的浪费,只能使用一次。为了解决这个问题,采用循环队列的实现方式。

;