美文网首页
玩转数据结构之队列

玩转数据结构之队列

作者: 付凯强 | 来源:发表于2019-02-01 20:21 被阅读0次

0. 序言

  • 队列也是一种线性结构
  • 相比数组,队列对应的操作是数组的子集
  • 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素

这篇文章会用之前的数组类Array实现一个底层为数组的队列ArrayQueue。建议在阅读本篇文章之前,先阅读关于动态数组类Array这篇文章:https://www.jianshu.com/p/02bbc13b5e5f 当然对数组了解比较深入的,可以直接阅读本篇。

1. 特点

  • 队列是一种先进先出的数据结构——First In First Out(FIFO)


    队列

2. 实现

Queue<E>

  • void enqueue(E):入队
  • E dequeue( ):出队
  • E getFront( ):查看队首的元素
  • int getSize( ):查询队列元素个数
  • boolean isEmpty( ):判断队列是否为空

3. 设计

队列的实现

定义一个基于数组的队列,实现接口Queue<E>中的方法。

4. 代码

  • 定义接口类Queue<E>
public interface Queue<E> {
    void enqueue(E e);
    E dequeue();
    E getFront();
    int getSize();
    boolean isEmpty();
}
  • 定义接口Queue<E>的实现类ArrayQueue<E>
public class ArrayQueue<E> implements Queue<E>{

    private Array<E> array;

    public ArrayQueue(int capacity){
        array = new Array<>(capacity);
    }

    public ArrayQueue(){
        array = new Array<>();
    }

    @Override
    public void enqueue(E e) {
        array.addLast(e);
    }

    @Override
    public E dequeue() {
        return array.removeFirst();
    }

    @Override
    public E getFront() {
        return array.getFirst();
    }

    @Override
    public int getSize() {
        return array.getSize();
    }

    @Override
    public boolean isEmpty() {
        return array.isEmpty();
    }

    public int getCapacity(){
        return array.getCapacity();
    }

        @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append("Queue:  ");
        res.append("font [");
        for (int i = 0; i < array.getSize(); i++) {
            res.append(array.get(i));
            if (i != array.getSize() - 1)
                res.append(", ");
        }
        res.append("] tail");
        return res.toString();
    }
}

基于动态数组实现,这个队列具备了动态数组扩容和缩容的功能。

public class Test_ArrayQueue {
    public static void main(String[] args){
        ArrayQueue<Integer> queue = new ArrayQueue<>();
        for (int i = 0; i < 10; i++) {
            queue.enqueue(i);
            System.out.println(queue);
            if (i%3==2){
                queue.dequeue();
                System.out.println(queue);
            }
        }
    }
}
Queue:  font [0] tail
Queue:  font [0, 1] tail
Queue:  font [0, 1, 2] tail
Queue:  font [1, 2] tail
Queue:  font [1, 2, 3] tail
Queue:  font [1, 2, 3, 4] tail
Queue:  font [1, 2, 3, 4, 5] tail
Queue:  font [2, 3, 4, 5] tail
Queue:  font [2, 3, 4, 5, 6] tail
Queue:  font [2, 3, 4, 5, 6, 7] tail
Queue:  font [2, 3, 4, 5, 6, 7, 8] tail
Queue:  font [3, 4, 5, 6, 7, 8] tail
Queue:  font [3, 4, 5, 6, 7, 8, 9] tail

从结果可知,添加三个元素就从队首取出一个元素,代码正确。

5. 复杂度分析

数组队列的复杂度
① 入队的操作的均摊复杂度为O(1)
如果对均摊复杂度不了解,可以跳转阅读这篇文章:https://www.jianshu.com/p/59f380c6ffcd
② 出队的操作的时间复杂度为O(n)
每次都会取出数组的第一个元素,需要搬移数据,可见性能不高。那如何提高性能呢?请关注下一篇关于循环队列的文章:https://www.jianshu.com/p/52d07a02aa97

6. 后续

如果大家喜欢这篇文章,欢迎点赞!
如果想看更多 数据结构 方面的文章,欢迎关注!

相关文章

  • 玩转数据结构之队列

    0. 序言 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(...

  • JavaScript数据结构之队列

    接上篇-数据结构之栈 数据结构之---队列 1.队列的定义 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端...

  • 玩转数据结构之循环队列

    0. 序言 循环队列是为了解决上一节中从队列队首取出数据的时间复杂度是O(n)的问题。我们再看下这个问题: 由于删...

  • 数据结构之队列的链式存储结构

    之前写了队列的顺序存储结构,队列的定义及操作见 数据结构之队列的顺序存储结构 队列的链式存储结构与操作实现 队列接...

  • 数据结构之队列

    数据结构之队列 定义 队列,是一种先进先出(FIFO, firt in first out)的线性表。队列的特性是...

  • skynet 源码阅读笔记 —— 消息调度机制

    基本数据结构之消息队列 skynet 采用了二级消息队列模式,其中顶层消息队列为 global_queue,而底层...

  • c++ 实现队列

    相关资料: 用C++实现一个队列 数据结构代码实现之队列的链表实现(C/C++)

  • JAVA数据结构之队列

    JAVA数据结构之队列 在计算机科学中,队列是一种数据结构,有点类似栈,只是在队列中第一个插入的数据也会最先被移除...

  • leetcode622.设计循环队列

    题目链接 题解: 在我的文章数据结构之——队列与循环队列 中,有关于循环队列的设计,包括本题没有考虑过的resiz...

  • Java 基础 35 数据结构和ArrayList集合的相关案例

    1.1 数据结构 什么是数据结构?数据的组织方式.维基百科 1.1.1 常见数据结构之栈和队列 1.1.2常见数据...

网友评论

      本文标题:玩转数据结构之队列

      本文链接:https://www.haomeiwen.com/subject/mindsqtx.html