• Java数据结构与算法(3):队列


    队列也是一种表,不同的是队列在一端进行插入而在另一端进行删除。

    队列模型

    队列的基本操作包括入队、出队操作。在表的末端插入元素,在表的开头删除元素,即先进先出(FIFO)。

    队列的数组实现

    对于每一个队列数据结构,保留一个数组items以及位置front和back,分别表示队列的两端,还要记录元素的个数size。操作过程应该是:当一个元素x入队,size和back增1,置items[back]=x;出队时,返回items[front],size减1,然后front增1。

    初始队列:

    入队:

    出队:

    由于数组是有边界的,上述过程重复多次后,可能出现back已经是数组的最后一个下标了,而数组中经过多次出队操作可能剩下很少甚至没有元素了,解决方式是只有front或back到达数组的尾端,它就又绕回到开头,这叫做循环数组实现。
    初始状态:

    1次入队后:

    2次入队后:

    1次出队后:

    2次出队后:

    3次出队后:

    4次出队后:

    代码示例

    关于队列,最终的就是入队和出队操作,这里使用队首和队尾与数组长度的关系判断队列是否为空、是否已满:

    public class MyArrayQueue<T> {
        private int front;
        private int back;
        private T[] items;
        private static final int DEFAULT_CAPACITY = 10;
    
        public MyArrayQueue() {
            this(DEFAULT_CAPACITY);
        }
    
        public MyArrayQueue(int size) {
            front = back = 0;
            items = (T[]) new Object[size];
        }
    
        public boolean isEmpty() {
            return front == back;
        }
    
        public void enqueue(T x) throws Exception {
            if ((back + 1) % items.length == front) {
                throw new Exception("队列已满");
            }
            items[back] = x;
            back = back % items.length + 1;
        }
    
        public T dequeue() throws Exception {
            if (back % items.length == front) {
                throw new Exception("队列为空");
            }
            T x = items[front];
            front = front % items.length + 1;
            return x;
        }
    }
    
  • 相关阅读:
    野火书籍《STM32库开发实战指南》配套例程
    使你的MFC程序具有win7的透明立体风格
    C#:params 关键字的学习
    "ASP.NET Ajax 客户端框架未能加载"解决办法
    未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。
    GIS:如何将东城和崇文合并
    委托和Lambda表达式(一):委托概述
    Cron表达式详解
    正则表达式在JAVA中的简单实例
    使用jdom创建XML文件
  • 原文地址:https://www.cnblogs.com/xiaoxiaoyihan/p/11611748.html
Copyright © 2020-2023  润新知