7. 队列

队列

  1. 队列是一种特殊的线性表,只能在头尾两端操作
  2. 队尾(rear):只能从队尾添加元素,一般叫做入队(enQueue)
  3. 队头(front):只能从队头移除元素,一般叫做出队(deQueue)
  4. 队列内部实现可以使用动态数组或双向链表实现
  5. 优先使用双向链表,因为队列主要往头尾操作元素
  6. 先进先出原则:First In First Out(FIFO)
    队列基本展示

队列的接口设计

  1. public lit size(); //元素数量
  2. public boolean isEmpty(); //是否为空
  3. public void enQueue(E element); //入队 说明:官方API为add()或offer()
  4. public void deQueue(); //出队 说明:官方API为remove()或poll()
  5. public E front(); //获取队列头元素 说明:官方API为peek()

队列的实现

public class Queue<E> {
    private List<E> list = new LinkedList<>();
	
    public int size() {
        return list.size();
    }

    public boolean isEmpty() {
        return list.isEmpty();
    }

    public void enQueue(E element) {
        list.add(element);
    }

    public E deQueue() {
        return list.remove(0);
    }

    public E front() {
        return list.get(0);
    }
}

双端队列

  1. 双端队列是可以在头尾两端进行添加、删除的队列
    双端队列展示

双端队列接口设计

  1. public lit size(); //元素数量
  2. public boolean isEmpty(); //是否为空
  3. public void enQueueFront(E element); //队头入队
  4. publiv void enQueueRear(E element); //队尾入队
  5. public void deQueueFront(); //队头出队
  6. public void deQueueRear() //队尾出队
  7. public E front(); //获取队列头元素
  8. public E rear(); //获取队尾元素

双端队列的实现

public class Deque<E> {
    private List<E> list = new LinkedList<>();
	
    // 元素的数量
    public int size() {
        return list.size();
    }

    // 是否为空
    public boolean isEmpty() {
        return list.isEmpty();
    }

    // 从队头出队
    public E deQueueFront() {
        return list.remove(0);
    }

    // 从队头入队
    public void enQueueFront(E element) {
        list.add(0, element);
    }

    // 从队尾入队
    public void enQueueRear(E element) {
        list.add(element);
    }

    // 从队尾出队
    public E deQueueRear() {
        return list.remove(list.size() - 1);
    }

    // 获取队列的头元素
    public E front() {
        return list.get(0);
    }

    // 获取队列的尾元素
    public E rear() {
        return list.get(list.size() - 1);
    }
}

循环队列

  1. 循环队列是指用一个队头变量(front)指向数组的第一个变量
    循环队列展示
  2. 每一次出栈,就将front位置的元素取出并删除,然后front+1
  3. 每一次入栈,就根据front和当前元素数量计算出入栈元素的索引,然后将元素放到数组对应的索引位置上

循环队列的接口设计

  1. public lit size(); //元素数量
  2. public boolean isEmpty(); //是否为空
  3. public void enQueue(E element); //入队
  4. public void deQueue(); //出队
  5. public E front(); //获取队列头元素

循环队列的实现

public class CircleQueue<E> {
	private int front;
    private E[] elements;
    prinvate int size;

    private static final int DEFAULT_CAPACITY = 10;
	
	public class CircleQueue() {
		elements = (E []) new Object[]
	}

    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public void enQueue(E element) {
        ensureCapcity(size + 1);
        elements[index(size)] = element;
        size++;
    }

    public E deQueue() {
        E element = elements[front];
        element[front] = null;
        //更新front
        front = index(1);    (1 + front) % elements.length
        size--;
        return element;
    }

    public E front() {
        return elements[front];
    }

    //保证数组容量
    private void ensureCapacity(int capacity) {
		int oldCapacity = elements.length;
		if (oldCapacity >= capacity) return;
	
		// 新容量为旧容量的1.5倍
		int newCapacity = oldCapacity + (oldCapacity >> 1); 
		E[] newElements = (E[]) new Object[newCapacity];
		for (int i = 0; i < size; i++) {
    		newElements[i] = elements[index(i)];
		}
		elements = newElements;
	
		// 重置front
		front = 0;
	}

	private int index(int index) {
		return (index + front) % elements.length;
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值