IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 自学数据结构时对于数组环形队列的代码解析 -> 正文阅读

[数据结构与算法]自学数据结构时对于数组环形队列的代码解析

(本人对于环形队列的代码解析,仅供个人观点)

public class ArrayTest {
        public static void main(String[] args) {
        Scanner myScan = new Scanner(System.in);
        boolean loop = true;
        System.out.println("请输入最大队列数:");
        LoopArray loopArray = new LoopArray(myScan.nextInt());
        while (loop){
            System.out.println();
            System.out.println("1.   添加数据");
            System.out.println("2.   取出数据");
            System.out.println("3.   显示数据");
            System.out.println("4.   退出程序");
            System.out.println("请输入你的选择....");
            char key = myScan.next().charAt(0);
            switch (key){
                case '1':
                    System.out.println("请输入要添加的数字:");
                    loopArray.add(myScan.nextInt());
                    break;
                case '2':
                    loopArray.get();
                    break;
                case '3':
                    loopArray.list();
                    break;
                case '4':
                    loop = false;
                    myScan.close();
                    break;
                case '5':
                default:
                    System.out.println("您的输入有误。");
            }
        }
        System.out.println("您退出了程序...");
    }
}

//循环数组的类
class LoopArray{
     int maxSize;//规模
     int HeadIndex;//头索引
     int FootIndex;//尾索引
    int[] arr;//数据存放

    public LoopArray(int maxSize){
        maxSize++; //+1是为了尾索引判断留出一个空位置
        this.maxSize = maxSize;//规模
        this.HeadIndex = 0;//头索引初始化
        this.FootIndex = 0;//尾索引初始化
        this.arr = new int[maxSize]; //初始化
    }

    //是否空
    public boolean isNull(){
        return HeadIndex == FootIndex; //当头尾索引重叠在一起时即判断为空
    }

    //是否满
    public boolean isFull(){
        return (FootIndex + 1) % maxSize == HeadIndex;//当循环时尾下一个是头索引时判断为满
    }

    //增加
    public void add(int data){
        if(isFull()){
            System.out.println("已满...");
        }else{
            arr[FootIndex] = data;//存放
            FootIndex = (FootIndex + 1) % maxSize;//指下一个坐标
        }
    }

    //取出
    public void get(){
        if(isNull()){
            System.out.println("已空....");
        }else{
//            HeadIndex %= maxSize;(错误示范)
            arr[HeadIndex] = 0;//模拟取出(变0)
            HeadIndex = (HeadIndex + 1) % maxSize; //最后再改变不是前面改变是因为判断时需要用到headIndex不能放进前面
            System.out.println("已经取出");
        }
    }

    //列表
    public void list(){
        if(isNull()){
            System.out.println("已空....");
        }else{     //从头索引开始遍历   , 遍历到 头索引+有效个数为止
            for(int i = HeadIndex;  i < HeadIndex + getSize(); i++){
                //为了方便理解,这里多加了一个temp变量, i %maxSize 的目的是为了不超过数组大小,循环得以顺利进行
                int temp = i % maxSize;
                System.out.print(arr[temp] + "\t");
            }
        }
    }

    //有效个数
    public int getSize(){
        if(isNull()){
            System.out.println("为空。");
            return 0;
        }
        return (FootIndex + maxSize - HeadIndex) % maxSize;
                //当FootIndex 比 HeadIndex 大时, 有效个数 就是 FootIndex - HeadIndex;

        //当FootIndex小于HeadIndex时,就让FootIndex先转一个周期,即 FootIndex + maxSize,这时候FootIndex绝对大于
        //HeadIndex,  这时候减去HeadIndex,就是非负数 ,也就是 (FootIndex + maxSize - HeadIndex)

        // 但是不知道是大是小,所以可以统一取模 maxSize...
        // 因为 FootIndex 和 HeadIndex 永远小于等于maxSize,所以取模 maxSize 都等于它本身;
        //所以当F(FootIndex) 比 H(HeadIndex) 大时,式子可以变成这样:
        // FootIndex - HeadIndex   ====>  (FootIndex - HeadIndex + maxSize)  % maxSize  取模不会影响结果;
        //化成这样的式子是为了适应 F 比 H 小的时候,即为了通用;
        //当然,搞不明白的话也可以把 return (FootIndex + maxSize - HeadIndex) % maxSize 改成以下:
//        if(FootIndex > HeadIndex){
//            return  FootIndex - HeadIndex;
//        }else{
//            return  (FootIndex + maxSize - HeadIndex);
//        }
    }
}

(本人对于环形队列的代码解析,仅供个人观点)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ---2022-02-06

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-07 13:58:02  更:2022-02-07 13:58:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:53:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码