数据结构之队列

Posted scanner小霸王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之队列相关的知识,希望对你有一定的参考价值。

队列

队列是一个有序列表,可以用数组或者链表来实现
遵循先入先出的原则,现存人的数据要先取出;
两个变量 font,rear表示前后端
rear=-1,font=-1表示队列中0个元素

思路分析:
ii)将尾指针往后移,rear+1,当front == rear【空】
ii)若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数组元素中,否则无法存入数据,rear==maxSize-1【队列满】

代码实现:

package 数据结构.队列;

import java.util.Scanner;

public class ArrayQueueDemo {
    public static void main(String[] args) {
        ArrayQueue arrayQueue = new ArrayQueue(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 ArrayQueue{
    private int maxSize;//表示最大容器
    private int font;//队列头
    private int rear;//队列尾
    private int[] arr;//存放数据,模拟队列

    public  ArrayQueue(int maxSize){
        this.maxSize = maxSize;
        arr = new int[maxSize];
        //初始化,这里代表0个元素
        font =-1;
        rear =-1;
    }

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

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

    //添加数据队列
    public void addQueue(int n){
        if(isFull()){
            System.out.println("队列已经满了");
            return;
        }
        rear++;
        arr[rear] = n;
    }

    //获取队列的数据,出队列
    public int getQueue(){
        if (isEmpty()){
            throw  new RuntimeException("队列为空,不能取数据");
        }
        //因为前面font为-1,所以这里需要先+1
        font++;
        return arr[font];

    }

    //显示数组
    public void  showQueue(){
        if (isEmpty()){
            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 (isEmpty()){
            throw  new RuntimeException("队列为空,不能取数据");
        }
        //因为前面font为-1,所以这里需要先+1
        return arr[font+1];

    }


}

环形队列
数组只用一次就不能重复使用,将这个环形数组使用算法,改成环形队列
在这里插入图片描述

在这里插入图片描述

数据的个数:(rear+maxsize-font)%maxSize这里主要是起到修正的作用,应该rear-font可能等于负数
预留一个空间,这个位置不放任何元素,作用就是为了区别队空和队满
下面环形队列代码font=0;rear=0为初始状态,即队列为0个元素

代码实现:

package 数据结构.队列;

import java.util.Scanner;

public class CircleArrayQueueDemo {
    public static void main(String[] args) {
        //最大只有三个a
        CircleArrayQueue arrayQueue = new CircleArrayQueue(4);
        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 CircleArrayQueue{
    private int maxSize;//表示最大容器
    private int font;//队列头
    private int rear;//队列尾
    private int[] arr;//存放数据,模拟队列

    public  CircleArrayQueue(int maxSize){
        this.maxSize = maxSize;
        arr = new int[maxSize];
        //初始化,这里代表0个元素
        font =0;
        rear =0;
    }

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

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

    //添加数据队列
    public void addQueue(int n){
        if(isFull()){
            System.out.println("队列已经满了");
            return;
        }
        arr[rear] = n;
        //考虑环形
        rear =(rear+1)%maxSize;
    }

    //获取队列的数据,出队列
    public int getQueue(){
        if (isEmpty()){
            throw  new RuntimeException("队列为空,不能取数据");
        }
        //1.先把font对应的值保存到一个临时变量
        //2.有font后移,考虑取模
        //3.将临时变量返回
        int value = arr[font];
        font = (font+1)%maxSize;
        return value;


    }

    //显示数组
    public void  showQueue(){
        if (isEmpty()){
            System.out.println("队列为空,不能取数据");
            return;
        }
        for (int i=font;i<(font+size());i++){
            System.out.printf("arr[%d]=%d\\n",i%maxSize,arr[i%maxSize]);
        }
    }

    //显示队列头部
    public int headQueue(){
        if (isEmpty()){
            throw  new RuntimeException("队列为空,不能取数据");
        }
        //因为前面font为-1,所以这里需要先+1
        return arr[font];

    }

    //取出有效数据个数
    public  int size(){
        return (rear+maxSize-font)%maxSize;
    }


}

以上是关于数据结构之队列的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之链式队列的代码实现及有趣应用

数据结构之链式队列的代码实现及有趣应用

perl中的队列

数据结构之栈和队列

数据结构之队列c代码实现

[数据结构]之队列