队列基础

  • 一种线性结构
  • 相比数组,队列的操作时数组操作的子集
  • 只能从一段(队尾)添加元素,只能从另一端(队首)取出元素
  • 一种先进先出的数据结构 First In First Out (FIFO)

队列的实现

Queue

  • void enqueue(E) O(1) 均摊
  • E dequeue() O(n)
  • E getFront() O(1)
  • int getSize() O(1)
  • boolean isEmpty() O(1)

循环队列

  • 相比普通队列,循环队列的出队时间复杂度降为O(1) 均摊。

在这里插入图片描述

  1. 入队
public void enqueue (E e){
    if ((tail + 1) % data.length == front)  // 队列已满
        resize(getCapacity()*2);  // 扩容操作
    data[tail] = e;
    tail = (tail + 1) % data.length;
    size++;
}
private void resize(int newCapacity){
    E[] newData = (E[]) new Object[newCapacity + 1]
        for(int i=0; i<size; i++)
            newData[i] = data[(i + front) % data.length];
    data = newData;
    front = 0;
    tail = size;
}
  1. 出队
public E dequeue(){
    if (isEmpty())
        throw new IllegalArgumentException("Cannot dequeue from an empty queue");
    E ret = data[front];
    data[front] = null;
    front = (front + 1) % data.length;
    size--;
    if (size == getCapacity / 4 && getCapacity() / 2 != 0)  // 缩容操作
        resize(getCapacity() / 2);
    return ret;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值