环行数组实现队列

1.背景

 

 

2.代码

复制代码
package com.ldp.structure.demo01;

import java.util.Scanner;

/**
 * @author 姿势帝-博客园
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 04/09 11:08
 * @description <p>
 * 环形数组实现队列
 * </p>
 */
public class Test02 {
    public static void main(String[] args) {
        // size=4,实际最多放入3个
        QueueArray queue = new QueueArray(4);
        Scanner scanner = new Scanner(System.in);
        String key = "";
        boolean flag = true;
        while (flag) {
            System.out.println("(s)show查看队列");
            System.out.println("(a)add添加一个元素");
            System.out.println("(g)get获取一个元素");
            System.out.println("(l)look查看下一个元素");
            System.out.println("(e)exit退出系统");
            key = scanner.next();
            switch (key) {
                case "s":
                    queue.show();
                    break;
                case "a":
                    System.out.println("请输入一个数字:");
                    try {
                        queue.add(Integer.valueOf(scanner.next()));
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case "g":
                    try {
                        System.out.println(queue.get());
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case "l":
                    try {
                        System.out.println(queue.look());
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case "e":
                    System.out.println("退出系统");
                    flag = false;
                    break;
                default:
                    System.out.println("输入错误");
            }
        }
    }
}

/**
 * 为空的判断条件:front==rear
 * 已满的判断条件:(rear+1)%maxSize==front
 * 当前有效个数的计算方式: (rear-front+maxSize)%maxSize
 */
class QueueArray {
    private int maxSize;// 最大方如个数,实际上最大只能放入maxSize-1
    private int front;// 将要取的下标
    private int rear; // 将要放入的下标
    private Integer[] dataArray;

    public QueueArray(int size) {
        this.dataArray = new Integer[size];
        this.maxSize = size;
        this.front = 0;
        this.rear = 0;
    }

    /**
     * 检查队列是否为空
     * 条件: front=rear
     */
    public boolean isEmpty() {
        if (front == rear) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 检查队列是否已满
     * 已满条件
     * (rear+1)%maxSize==front
     *
     * @return
     */
    public boolean isFull() {
        if ((rear + 1) % maxSize == front) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 检查队列中有效个数
     *
     * @return
     */
    public int haveNum() {
        return (rear - front + maxSize) % maxSize;
    }

    /**
     * 添加一个元素
     *
     * @param n
     */
    public void add(int n) {
        if (isFull()) {
            throw new RuntimeException("队列已满");
        } else {
            dataArray[rear] = n;
            // 支持循环存放,当前数组的下标
            rear = (rear + 1) % maxSize;
        }
    }

    /**
     * 获取队列中的一个数据
     *
     * @return
     */
    public int get() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空");
        } else {
            int n = dataArray[front];
            dataArray[front] = null;
            // 支持循环取出,当前数组的下标
            front = (front + 1) % maxSize;
            return n;
        }
    }

    /**
     * 即将出队列的值
     *
     * @return
     */
    public int look() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空");
        } else {
            return dataArray[front];
        }
    }

    /**
     * 打印数组
     */
    public void show() {
        System.out.print("[");
        for (int i = 0; i < dataArray.length; i++) {
            System.out.print(dataArray[i] + "\t");
        }
        System.out.print("]");
        System.out.println();
    }
}
复制代码

 

完美

posted @   不停学  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示