JAVA数据结构队列(数组实现)

队列是一个有序列表,它可以用数组或者是链表来实现
遵循先进先出的原则。先存入的数据要先取出,后存入的要后取出

数组模拟队列
队列本身是有序队列,所以使用数组来实现
队列的输入和输出是有前后端来处理,因此需要两个变量front及rear分别记录队列前后端的下标,front会根据队列的输出而改变,rear会根据队列的输入而改变。

往队列中插入数据
将尾指针rear后移,但是前提是rear小于队列的最大下标maxsize-1,当rear<maxseizes-1时将它放入当前rear的位置,如果rear == maxsize-1时队列满了
当rear=front时候为空

下面就可以上代码了

package com.gsy.queue;

import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;

import java.util.Scanner;

/**
 * @program: DataStructures
 * @description: 使用数组来模拟队列
 * @author: GSY
 * @create: 2020-03-24 10:30
 **/
public class ArrayQueueDemo {


    public static void main(String[] args){


        ArrayQueue arrayQueue = new ArrayQueue(3);
        int flag;//接收用户输入
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
        while (loop){
            System.out.printf("1(show):展示数据\n");
            System.out.printf("2(exit):退出程序\n");
            System.out.printf("3(add):添加数据\n");
            System.out.printf("4(get):取出数据\n");
            System.out.printf("5(head):查看队列头数据\n");
            flag = scanner.nextInt();

            switch (flag){

                case 1 : arrayQueue.showQueue();
                        break;
                case 2 : scanner.close();
                         loop = false;
                         System.out.printf("程序退出\n");
                         break;
                case 3 :
                    System.out.printf("输入一个数字\n");
                    int value = scanner.nextInt();
                    arrayQueue.addQueue(value);
                    break;
                case 4 :
                    try {
                        int queuevaule = arrayQueue.getQueue();
                        System.out.printf("取出的数据为:%d\n",queuevaule);
                    }catch (Exception e){
                        System.out.printf(e.getMessage());
                    }
                    break;
                case 5 :
                    try {
                        System.out.printf("队列头数据为%d\n",arrayQueue.headQueue());
                    }catch (Exception e){
                        System.out.printf(e.getMessage());
                    }
                    break;
                default:
                    break;
            }
        }

    }



}

//使用数组实现一个队列
class ArrayQueue{

    private int maxsize;//队列的容量
    private int front;//队列头指针,指向队列头的前一个位置
    private int rear;//队列尾指针,指向队列的最后一个数据
    private int[] arr;//用数组来模拟队列


    public ArrayQueue(int Maxsize){
        this.maxsize = Maxsize;
        arr = new int[maxsize];//初始化队列
        rear = -1;
        front = -1;
    }

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

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

    //向队列中加入数据
    public void addQueue(int n){

        //判断队列是否满
        if (isFull()){
            System.out.printf("队列已经满了,不难再加入数据\n");
            return ;
        }
        rear++;//尾指针向后移动
        arr[rear] = n;
    }


    //从队列中取出数据
    public  int getQueue(){

        //先判断队列是否为空
        if (isEmpty()){

            throw  new RuntimeException("队列为空,不能取出数据\n");
        }
        front ++ ;
        return arr[front];
    }

    //显示队列的所有数据
    public void showQueue(){

        //判断队列是否为空
        if (isEmpty()){
            System.out.printf("队列为空,没有数据\n");
            return;
        }
        for (int i = 0 ; i <= rear ; i++){
            System.out.printf("arr[%d]=%d\n",i,arr[i]);
        }
    }


    //取出队列的头数据
    public int headQueue(){

        //判断队列是否为空
        if (isEmpty()){
            throw new RuntimeException("队列为空,没有头数据\n");
        }

        return arr[front+1];
    }

}

用数组实现这个队列的话比较简单,但是有一些不好的地方就是这个队列不可以重复使用,当你存入数据,然后从队列拿出数据之后,就不可以再存入数据,因为当你取出数据的时候它只有队列头发生变化,队列尾没有发生变化,然后它一直一直队列是是满的,其实是还有空间。

这个时候就要用循环队列了。
下个博客实现。
循环队列地址:https://blog.csdn.net/weixin_43404016/article/details/105177325

发布了34 篇原创文章 · 获赞 15 · 访问量 3222

猜你喜欢

转载自blog.csdn.net/weixin_43404016/article/details/105177212