卜若的代码笔记-数据结构系列-第十六章:队列一.数组实现

1.实现思路如图16-1所示

图16-1:

当然,这种实现办法有好处也有坏处。

坏处是,数组原先的资源没有被释放,留着占内存。

另外,如果使用固定长度的数组,那么很容易就会满数组,从而爆出指针超过边界的文图

优化方式见图16-2

好处是,入队和出队的时间复杂度是o(1) 

 

图16-2:

对于图2的方法,可以节省了空间的开销,但是,对于出队的操作时间复杂度则是o(n)。

这种写法其实不是很好

以下是图16-1的实现代码:

public interface IQueue<T> {

    void enQueue(Element<T> element);
    Element<T> deQueue();
    int len();

}
public class TQueue<T> implements IQueue<T> {


    DynamicArray<Element<T>> list;
    public int head;
    public int end;
    private int len;
    public TQueue(){
        //见该系列第14章
        list = new DynamicArray<>(20);
    }
    @Override
    public void enQueue(Element<T> element) {
        list.change(end,element);
        end++;
        len++;
    }

    @Override
    public Element<T> deQueue() {

        if (len<=0){

            Debug.Log("队列为空");

             return null;
        }
        Element el = list.get(head);
        head++;

        len--;
        return el;
    }

    @Override
    public int len() {

        return len;
    }
}

以下是图16-2的实现代码

 就是多了个前移的操作

public class TQueue2<T> extends TQueue<T> {


    @Override
    public Element<T> deQueue() {

        Element head = getList().get(0);

        for (int i = 1;i<len();i++){
            getList().change(i-1,getList().get(i));
        }
        setLen(len()-1);
        return head;
    }
}

测试代码:

 public static void main(String[] args) throws IOException {

        TQueue2<Integer> tQueue = new TQueue2<>();

        for (int i =0;i<100;i++){
            tQueue.enQueue(new TElement<>(i));

        }

        while (tQueue.len()!= 0){

            System.out.println(tQueue.deQueue().getValue()+"<长度:>"+tQueue.len());
        }
        System.out.println("\n");

    }

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值