0
点赞
收藏
分享

微信扫一扫

使用数组模拟队列

深夜瞎琢磨 2022-04-14 阅读 90
java

队列特点:先进先出

采用数组来模拟队列

        收先创建一个容量为6的数组,因此定义一个maxSize=6,因为需要空出来一个容量,所以可以存储数据的容量为5,需要定义两个指针帮助我们遍历数组,一个是rear,用来指向最后加入的元素,另一个是front,用来指向最开始添加的元素。如果rear==front,就说明数组为空,如果(rear+1)%maxSize==front,说明数组已经满了,无法添加。相当于rear指向的位置刚好在front 下方,比如front指向0,rear指向5,(5+1)%6=0,数组满,但是由于需要空一个容量出来,其实数组下标为5的并没有内容,相当于rear指向的数组下标没有数据,正好满足需要空出来一个容量的要求。

        添加元素的时候需要先rear=rear%maxSize,然后在数组[rear]=需要添加的元素,最后在rear++;删除同理。

        遍历的时候需要判断rear和front的大小,根据他们的位置来判断遍历的顺序。

package Queue;

import java.util.Scanner;

/**
 *用数组模拟队列,可重复使用
 */
public class ReQueueArray {
    public static int maxSize;//为数组最大长度
    public static int front=0;//头部指针 指向最开始添加的元素
    public static int rear=0;//尾部指针 指向最后添加的元素
    public static boolean flag=true;
    public static int[] queueArray;//数组,用来模拟队列

    public static void main(String[] args) {
        createArray(6);
        System.out.println("---------------------展示队列--------------------------");
        Scanner scanner=new Scanner(System.in);
        while (flag){
            System.out.println("添加数据,请输入: add");
            System.out.println("删除数据,请输入: sub");
            System.out.println("显示队列,请输入: list");
            System.out.println("退出,请输入: exit");
            String s=scanner.nextLine();
            switch (s){
                case "add":
                    System.out.println("请输入要添加的数:");
                    int a=scanner.nextInt();
                    scanner.nextLine();
                    addElement(a);
                    break;
                case "sub":
                    subElement();
                    System.out.println("删除成功!");
                    break;
                case "list":
                    displayArray();
                    break;
                case "exit":
                    System.out.println("---------------------展示结束--------------------------");
                    flag=false;
                    break;
                default:
                    System.out.println("输入有误,请重新输入");
                    break;
            }
        }

    }
    /**
     * 创建数组,用来模拟队列
     * @param n 数组的长度
     */
    public static void createArray(int n){
        queueArray=new int[n];
        maxSize=queueArray.length;

    }
    /**
     * 判断数组是否为空
     * @return 返回false代表不为空,返回ture代表为空
     */
    public static boolean isEmpty(){
        if (front==rear){
            return true;
        }
        return false;
    }
    /**
     * 判断数组是否满了 只要尾部指针在头部指针前一个 就是满了
     * @return 返回false代表不满,返回ture代表满了
     */
    public static boolean isFull(){
        if ((rear+1)%maxSize==front){
            return true;
        }
        return false;
    }
    /**
     * 添加元素,按顺序
     * @param element 添加的元素
     */
    public static void addElement(int element){
        //添加之前得判断是否数组是否满了,如果满了就不能添加了
        if (isFull()){//数组满了 无法添加
            System.out.println("队列已经满了无法添加!");
        }else {//数组没有满,还可以添加
            //添加元素
            rear=rear%maxSize;
            queueArray[rear]=element;
            //头指针加1
            rear++;
        }
    }

    /**
     * 删除队列中的元素,先添加的先删除,模拟先进先出
     */
    public static void subElement(){
        //删除元素之前先判断数组是否为空
        if (isEmpty()){
            System.out.println("队列为空,无法删除元素!");
        }else {
            //让当前尾部指针指向的元素为0
            front=front%maxSize;
            queueArray[front]=0;
            //尾部指针加1
            front++;
        }
    }
    /**
     * 输出数组
     */
    public static void displayArray(){
        if (isEmpty()){
            System.out.println("队列为空!");
        }else {
            System.out.println("队列中的元素为:");
            if (front<rear){
                for (int i = front; i < rear; i++) {
                    System.out.println(queueArray[i]);
                }
            }else {
                for (int i = front; i < maxSize; i++) {
                    System.out.println(queueArray[i]);
                }
                for (int i = 0; i < rear; i++) {
                    System.out.println(queueArray[i]);
                }
            }

        }
    }
}
举报

相关推荐

0 条评论