用数组模拟队列

队列:

1,队列是一种先进先出的线性表,它只允许在表的一段进行插入,而在另一端删除元素,在队列中,允许插入的一段叫做队尾(rear),允许删除的一端则称为队头。

2,举例:①银行叫号排队

                ②操作系统中的作业排队:在允许多道程序运行的操作系统中,同时有几个作业运行,如果运行的结果都需要用通道输出,那就要按请求输出的先后次序排队。每当通道传输完毕可以接受新的输出任务时,队头的作业先从队列中推出作输出操作。凡是申请输出的作业都从队尾进入队列

3,数组模拟队列示意图:

 4,数组模拟队列思路:

首先,如上图所示:

  • MaxSize是该队列的最大容量
  • 因为队列的输入输出分别从两端进行,因此用两个变量front和rear分别记录两端的下标,front会随着数据输出而改变,rear会随着数据输入而改变
  • 当我们将数据存入队列时,rear+1,如果rear==front,则说明队列为空;如果rear==MaxSize-1,则说明队列已满

5,代码实现

package com.boogie.QueueArr;

import java.util.Scanner;

public class QueueArr {
    public static void main(String[] args) {
        ArrQueue queue=new ArrQueue(3);
        char key=' ';
        Scanner scan=new Scanner(System.in);
        boolean loop=true;
        while(loop) {
            System.out.println("s(show):显示队列");
            System.out.println("a(add):添加数据到队列");
            System.out.println("g(get):从队列取出数据");
            System.out.println("h(head):查看队列头的数据");
            System.out.println("e(exit):退出程序");
            key=scan.next().charAt(0);
        
        switch(key) {
        case's':
            queue.showQueue();
            break;
        case'a':
            System.out.println("请输入一个数字:");
            int value=scan.nextInt();
            queue.addQueue(value);
            break;
        case'g':
            try {
                int res=queue.getQueue();
                System.out.printf("取出的数据是%d
",res);
            } catch (Exception e) {
            
                System.out.println(e.getMessage());
            }
            break;
        case'h':
            try {
                int res=queue.headQueue();
                System.out.printf("队列头的数据是:%d
",res);
                
            } catch (Exception e) {
                
                System.out.println(e.getMessage());
            }
            break;
        case'e':
            scan.close();
            loop=false;
            break;
            default:
                break;
        }
            
        }
        System.out.println("程序退出~~");
    }
}
//使用数组模拟队列——编写一个QueueArr类
class ArrQueue{
    private int Maxsize;//表示数组的最大容量
    private int front;//队列头
    private int rear;//队列尾
    private int[] Arr;//用于存放数据
    
    //创建队列的构造器
    public ArrQueue(int ArrMaxsize) {
        Maxsize=ArrMaxsize;
        Arr=new int[Maxsize];
        front=-1;
        rear=-1;
    }

//判断队列是否满
public boolean QueueisFull(){
    return  rear==Maxsize-1;
}
//判断队列是否空
public boolean QueueisEmpty() {
    return rear==front;
}
//添加数据到队列
public void addQueue(int n) {
    if(QueueisFull()) {
        System.out.println("队列已满,无法加入数据");
        return;
    }
    rear++;//rear后移
    Arr[rear]=n;
}
//获取队列数据,出队列
public int getQueue(){
    if(QueueisEmpty()) {
        throw new RuntimeException("队列为空,没有数据");
        }
    front++;
    return Arr[front];
}
//显示队列的所有数据
    public void showQueue(){
        if(QueueisEmpty()) {
            System.out.println("队列为空,没有数据");
            return;
        }for(int i=0;i<Arr.length;i++) {
        System.out.printf("Arr[%d]=%d
",i,Arr[i]);
        }
    }
    //显示队列的头数据
    public int headQueue() {
        if(QueueisEmpty()) {
            System.out.println("队列为空,没有数据");
            }return Arr[front+1]; 
            
    }
}

运行结果:

原文地址:https://www.cnblogs.com/boogie-xy/p/11547028.html