栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021 - 9 -下旬 数据结构- 线性表 -双端循环队列 - java实现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021 - 9 -下旬 数据结构- 线性表 -双端循环队列 - java实现

//循环双端队列:Circle Double Ended Queue
//本质是对动态数组的优化
//队头队尾都可以添加或删除元素
//相比于普通循环队列需要注意的点是在队头插入元素时的对front前移的处理

public class CircleDequeZH {
    private int size;
    private int front;
    private  E elements[];
    private static final int DEFAULT_CAPACITY = 10;

    public CircleDequeZH() {
        elements = (E[]) new Object[DEFAULT_CAPACITY];
    }

    private int getMo(int a, int b){
        return a > b ? (a-b) : a;
        //%运算效率太低,当a<2b时可以用这个表达式替代取模,而循环队列front+index最大等于2*length-1,恰好符合要求
    }

    //计算队头队尾元素下标可以写一个函数,用来映射循环队列中的真实索引
    public int realIndexCaculate(int index){
        if (index<0){
            return getMo((index + front + elements.length), elements.length);
            //当front=0时,我们在队头插入元素,front要前移,也就是到整个数组的末尾,所以单独写一个if应对这种情况
            //这时候front的新位置为(front-1+length)%length
        }
        return getMo((index+front),elements.length);//!!!
        //就是要找队列中的下标为index的(第index+1个)元素,返回它在我们数组里的真实下标
        //我觉得影响以后的可读性就没用
    }


    private void ifNeedEnLarge(int needCapacity){
        int oldcapacity = elements.length;
        if (needCapacity<=oldcapacity){
            return;
        }else{
            int newcapacity = oldcapacity + (oldcapacity>>1);
            E[] newElements = (E[]) new Object[newcapacity];
            for (int i=0;i
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/298675.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号