Loading

队列

1、简介

1)队列是一个有序列表,可以用数组或者链表来实现

2)遵循先进先出的规则,即先进队的先出队

2、数组模拟队列

clipboard

数组模拟队列的代码实现:

front:指向队头的前一个数据

rear:指向队尾

/**
 * @author houChen
 * @date 2020/7/26 10:09
 * @Description:   使用数组来模拟队列
 */
public class ArrayQueueDemo {
    public static void main(String[] args) {
        ArrayQueue queue =new ArrayQueue(3);
        char key = ' ';
        Scanner scanner = new Scanner(System.in);
        boolean loop =true;
        while(loop){
            System.out.println("s:显示队列");
            System.out.println("e:退出程序");
            System.out.println("a:添加数据到队列");
            System.out.println("g:从队列取出数据");
            System.out.println("h:查看队列头的数据");

            key=scanner.next().charAt(0);
            switch (key){
                case 's':
                    queue.showQueue();
                    break;
                case 'a':
                    System.out.print("输入一个数:");
                    int value = scanner.nextInt();
                    queue.addQueue(value);
                    break;
                case 'g':
                    try {
                        queue.getQueue();
                    } catch (Exception e) {
                        System.out.printf(e.getMessage());
                    }
                    break;
                case 'h':

                    try {
                        int v= queue.headQueue();
                        System.out.printf("从队头取出的元素为:%d",v);
                    } catch (Exception e) {
                        System.out.printf(e.getMessage());
                    }

                    break;
                case 'e':
                    scanner.close();
                    loop=false;
                    break;
            }
            System.out.println();
        }
        System.out.println("程序退出~~");
    }


}


class ArrayQueue{

    private int maxSize; //表示数组的最大容量
    private int front;  //队列头
    private int rear;   //队列尾
    private int[] array; //存放数据

    // 创建队列的构造器
    public ArrayQueue(int maxSize) {
        this.maxSize = maxSize;
        array =new int[maxSize];
        front=-1;
        rear = -1;
    }

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

    // 判断队列是否为空
    public boolean isEmpty(){
        return rear == front;
    }

    // 添加数据到队列 addQueue
    public void addQueue(int a){
        if(isFull()){
            System.out.println("队列已满,不能添加数据!!");
            return;
        }
        array[++rear]=a;
    }

    // 数据出队列 getQueue
    public void getQueue(){
        if(isEmpty()){
            throw new RuntimeException("队列为空,不能出队!!");
        }
        int a = array[++front];
        System.out.printf("出队数据为%d",a);
    }

    // 显示队列的所有数据 showQueue
    public void showQueue(){
        if(isEmpty()){
            System.out.println("队列为空!!!");
            return;
        }
        System.out.println("队列为:");
        for(int i=0;i<array.length;i++){
            System.out.printf("%d\t",array[i]);
        }
        System.out.println();
    }

    // 显示队列头的数据,注意不是取出数据 headQueue
    public int headQueue(){
        if(isEmpty()){
            throw new RuntimeException("队列为空!!!");
        }
        return array[front+1];
    }
}

 

clipboard

3、数组模拟环形队列

1)目前数组使用一次就不能使用,没有达到复用的效果

2)将这个数组使用算法,改进成一个环形的队列

clipboard

【注意:自己理解】为什么要预留一个空位?(即:数组有八个位置 0-7,为什么入队到6处就算满了)

这是因为:

当从0入队到7时,rear此时指向的位置为 (7+1)% 8 = 0,rear == front

这就和判断队列为空重复了,为了避免两种情况混淆,就将maxSize-1(8-1=7)作为环形队列存储元素的最大个数

代码实现

front:指向对头

rear:指向队尾的下一个元素

public class CircleArrayQueueDemo {
    public static void main(String[] args) {
        CircleArray queue =new CircleArray(3);
        char key = ' ';
        Scanner scanner = new Scanner(System.in);
        boolean loop =true;
        while(loop){
            System.out.println("s:显示队列");
            System.out.println("e:退出程序");
            System.out.println("a:添加数据到队列");
            System.out.println("g:从队列取出数据");
            System.out.println("h:查看队列头的数据");

            key=scanner.next().charAt(0);
            switch (key){
                case 's':
                    queue.showQueue();
                    break;
                case 'a':
                    System.out.print("输入一个数:");
                    int value = scanner.nextInt();
                    queue.addQueue(value);
                    break;
                case 'g':
                    try {
                        queue.getQueue();
                    } catch (Exception e) {
                        System.out.printf(e.getMessage());
                    }
                    break;
                case 'h':

                    try {
                        int v= queue.headQueue();
                        System.out.printf("从队头取出的元素为:%d",v);
                    } catch (Exception e) {
                        System.out.printf(e.getMessage());
                    }

                    break;
                case 'e':
                    scanner.close();
                    loop=false;
                    break;
            }
            System.out.println();
        }
        System.out.println("程序退出~~");
    }
}


class CircleArray{
    private int maxSize; //表示数组的最大容量
    private int front;  //指向队头              默认为0
    private int rear;   //指向队尾的后一个位置    默认为0
    private int[] array; //存放数据

    // 创建队列的构造器
    public CircleArray(int maxSize) {
        this.maxSize = maxSize;
        array =new int[maxSize];
    }

    // 判断队列是否为满
    public boolean isFull(){
        return (rear+1)%maxSize == front;
    }

    // 判断队列是否为空
    public boolean isEmpty(){
        return rear == front;
    }

    // 添加数据到队列 addQueue
    public void addQueue(int a){
        if(isFull()){
            System.out.println("队列已满,不能添加数据!!");
            return;
        }
        array[rear]=a;
        rear=(rear+1)%maxSize;
    }

    // 数据出队列 getQueue
    public void getQueue(){
        if(isEmpty()){
            throw new RuntimeException("队列为空,不能出队!!");
        }
        int a = array[front];
        front=(front+1)%maxSize;
        System.out.printf("出队数据为%d",a);
    }

    // 显示队列的所有数据 showQueue
    public void showQueue(){
        if(isEmpty()){
            System.out.println("队列为空!!!");
            return;
        }
        //从front遍历,遍历多少个元素
        System.out.println("队列为:");
        for(int i=front;i<front+size();i++){
            System.out.printf("%d\t",array[i%maxSize]);
        }
        System.out.println();
    }

    //队列的长度
    public int size(){
        return (rear+maxSize-front)%maxSize;
    }


    // 显示队列头的数据,注意不是取出数据 headQueue
    public int headQueue(){
        if(isEmpty()){
            throw new RuntimeException("队列为空!!!");
        }
        return array[front];
    }
}

 

posted @ 2020-07-27 11:30  青岑  阅读(178)  评论(0编辑  收藏  举报