队列Queue源码分析

定义:队列是 只允许在一端进行插入操作,而在另一端进行删除操作的线性表

  • 插入的一端称为队尾,删除的一端称为对头

缺点:出栈复杂度高,容易造成假溢出:可能对头有很多空位置,此时插入放到了队尾,就可能造成溢出,此时叫做假溢出

解决办法:循环队列-把头尾相接的循序存储结构称为循环队列(可以解决假溢出) 队列的链式存储及结构模式:队列的链式存储及结构,其实就是线性表的单链表,只不过它只能头出尾进而已

Queue源码分析

public interface Queue<E> extends Collection<E> {
   //将元素添加到这个队列中,但是如果没有可用空间,则抛出异常IllegalStateException
    boolean add(E e);
    //入队
    boolean offer(E e);
    //移除头部或者如果队列为空。则返回null
     E remove();
     //出队
     E poll();
    //如果为空,只抛出异常,检索头部
    E element();
    //检索头部但不删除
    E peek();
}
看下LinkedList源码分析,之前写过一篇文章http://blog.csdn.net/qq_24675479/article/details/79542935这里就不阐述,直接看如何入队和出队
     //入队
    public boolean offer(E o) {
         //之前分析过,不看源码了,这里就是将数据添加到末尾
        return addLastImpl(o);
    }
     //出队
   public E poll() {
            //如果为空直接返回空,否则移除头部
        return size == 0 ? null : removeFirst();
    }
   public E removeFirst() {
        return removeFirstImpl();
    }
private E removeFirstImpl() {
        Link<E> first = voidLink.next;//首先获得头部的下一个指针,如01
        if (first != voidLink) {//01不为空
            Link<E> next = first.next;//获得01的下一个指针如02
            voidLink.next = next;//将头部的下个指针指向02
            next.previous = voidLink;//02的前一个指针指向头部
            size--;//大小-1
            modCount++;
            return first.data;
        }
        throw new NoSuchElementException();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值