用数组模拟队列

队列:java

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

2,举例:
①银行叫号排队
②操做系统中的做业排队:在容许多道程序运行的操做系统中,同时有几个做业运行,若是运行的结果都须要用通道输出,那就要按请求输出的前后次序排队。每当通道传输完毕能够接受新的输出任务时,队头的做业先从队列中推出做输出操做。凡是申请输出的做业都从队尾进入队列ide

3,数组模拟队列示意图:
用数组模拟队列
4,数组模拟队列思路:oop

首先,如上图所示:操作系统

MaxSize是该队列的最大容量
由于队列的输入输出分别从两端进行,所以用两个变量front和rear分别记录两端的下标,front会随着数据输出而改变,rear会随着数据输入而改变
当咱们将数据存入队列时,rear+1,若是rear==front,则说明队列为空;若是rear==MaxSize-1,则说明队列已满
5,代码实现code

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\n",res);
            } catch (Exception e) {

                System.out.println(e.getMessage());
            }
            break;
        case'h':
            try {
                int res=queue.headQueue();
                System.out.printf("队列头的数据是:%d\n",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\n",i,Arr[i]);
        }
    }
    //显示队列的头数据
    public int headQueue() {
        if(QueueisEmpty()) {
            System.out.println("队列为空,没有数据");
            }return Arr[front+1]; 

    }
}
相关文章
相关标签/搜索