• 算法_队列的Java通用数组实现


      在实现Queue的API的时候,可以使用两个实例变量做索引,一个变量head指向队列的开头,另一个变量tail指向队列的结尾.在删除一个元素的时候,使用head访问,并将head+1,插入一个元素的时候,使用tail保存它,并将tail加1.如果某个索引增加到超过了数组的边界的时候,则将它重置为0.下面是队列的数组实现,除了对于头元素和尾元素的基本操作以外,其余基本和堆栈相同.

      

    import java.util.Iterator;
    
    //编写一个类ResizingArrayQueueOfStrings使用定长数组实现队列的抽象,
    //然后扩展实现,使用调整数组的方法突破数组大小的限制
    public class ResizingArrayQueueOfStrings<Item> implements Iterable<Item> {
        private Item[] a=(Item[])new Object[1];
        int head=0;        //指向队列的开头的索引
        int tail=0;        //指向队列的结尾的索引
        int N;            //数组中装填的元素数量
        
        public boolean isEmpty() {
            return N==0;
        }
        public int size() {
            return N;
        }
        public void add(Item item) {
            if(N==a.length) resize(a.length*2);//N增加至数组容量的时候,动态扩展数组的大小
            a[tail++]=item;        //从tail(尾部)索引处获取元素.
            if(tail==a.length) tail=0;    //如果tail索引增加到了数组的长度,那么重新置0
            N++;                //增加N.
        }
        public Item remove() {
            Item item=a[head];    //从队列头移除元素
            a[head++]=null;        //将队列头的元素设为null,避免对象游离
            N--;                //将N减一
            if(head==a.length) head=0;    //如果head索引增加到了数组的长度,重新置0
            if(N<a.length/4) resize(a.length/2);    
            return item;    //返回队列头部的元素.
        }
        public void resize(int n) /*动态调整数组大小的方法*/{
            //将数组引用指向一个更大的数组
            Item[] items=(Item[])new Object[n];
            for(int i=0;i<N;i++) {
                items[i]=a[(i+head)%a.length];    //从头元素开始赋值给新的元素.
            }
            a=items;
            //将头元素和尾部元素分别置位.
            head=0;    
            tail=N;
        }
        @Override
        public Iterator<Item> iterator() {
            return new QueueIterator();
        }
        class QueueIterator implements Iterator<Item> {
            int i=0;
            @Override
            public boolean hasNext() {
                return i<N;    
            }
    
            @Override
            public Item next() {
                Item item=a[(i+head)%a.length];    //从头元素开始获取元素.
                i++;
                return item;
            }
            
        }
    }
  • 相关阅读:
    mysql8.0.29 rpm安装步骤
    Django创建自定义命令
    BootStrap5应用时tooltips的添加
    mybatis相关转义字符串报错Cause: org.xml.sax.SAXParseException
    【资源共享】RK 单麦克语音通话 3A 算法集成说明及参数 调试说明文档
    k8s docker 中部署think php 并搭建php websocket
    .net core Unicode 转中文
    Webgl多层次模型
    小程序接口申请和隐私文档
    小程序开发入门
  • 原文地址:https://www.cnblogs.com/hlhdidi/p/5625935.html
Copyright © 2020-2023  润新知