• 算法_队列的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;
            }
            
        }
    }
  • 相关阅读:
    Spring基础知识点总结
    秒懂设计模式--代理模式(proxy)
    秒懂设计模式--工厂模式
    秒懂设计模式--适配器模式
    秒懂设计模式--装饰者模式
    秒懂设计模式--观察者模式
    单例模式的几种实现
    springboot2.0+spring cloud+eureka搭建微服务步骤
    字符串排序算法
    bitbucket的简单使用
  • 原文地址:https://www.cnblogs.com/hlhdidi/p/5625935.html
Copyright © 2020-2023  润新知