• 野生前端的数据结构基础练习(2)——队列


    网上的相关教程非常多,基础知识自行搜索即可。

    习题主要选自Orelly出版的《数据结构与算法javascript描述》一书。

    参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Queue

    队列的基本知识

    • 特点:

      先进先出。

    • 用途:

      模拟流程或其他带有抽象排队属性的事物或逻辑,例如时间循环队列,发布订阅模式的回调队列等等。

    • 基本方法

      • enqueue()在队尾插入一个元素

      • dequeue()从队头删除一个元素

      • getHeader()获取队头的元素

      • getTail()获取队尾的元素

      • getLength()获取队列的长度

      • isEmpty()判断队列是否为空队列

    • 需要留意的问题

      使用javascript语言来理解数据结构只能够帮助我们理解结构的基本特性,由于不涉及底层的原理,所以无法深入到算法细节的时间复杂度的话题上,对此感兴趣的同学建议在学习完数据结构入门后再去学习C语言描述版的数据结构资料。

    基本练习

    1. 根据栈的特性实现一个Queue类,并在后续题目中需要用队列时使用它。

    2. 编写一个函数dancingQueue(str),str中记录着前来参加舞会的人的性别,以空格分割,函数中需要实现将前来跳舞的人按性别分成两队,每当舞池中有空位时,男队和女队的排在最前面的人组成舞伴进入,如果某一队为空时,需要返回对应的消息。

    3. 实现一个PriorityQueue类,实现优先队列的功能,优先队列的元素带有权重,权重越高(一般认为数字越小权重越高)的越早出队。

    课后习题(书中第五节习题)

    1. 修改Queue类,生成一个Deque类,允许从队列两端添加和删除元素,因此也叫双向队列。

    2. 使用Deque类判断一个单词是否是回文。

    3. 题目3和题目4比较简单,不再赘述。

    习题思路

    1. javascript中的数组就符合双向队列的特性,试着自己去实现几个特征方法即可。

    2. Deque类可以从队列两端出队,每次从两端各出队一个元素进行比较即可。

    扩展- 循环队列

    循环队列书中并没有提及,它是一种特殊的队列。简单理解就是将基本队列只当做存储结构,而使用frontrear两个指针分别代表队列的头和尾,实际对外表现的队列是frontrear所指向的元素构成的。为了复用存储空间,循环队列在存储结构的实现上是首位相连的。

    • 基本要素

      • front指针指向队头

      • rear指针指向队尾

      • size队列的长度

      • length存储空间的大小

    • 基本方法

      • enqueue()元素入队

      • dequeue()元素出队

      • isEmpty()判断队空

      • isFull()判断队满

      • getSize()获取队列长度

      • getLength()获取存储空间长度

      • clear()清空队列

    基本练习

    实现一个CircularQueue类,并添加一个扩展方法resize(),当存储空间已满且有元素入队时,自动将存储空间扩充一倍,当元素出队造成队列长度不足存储空间的1/4时,将存储空间减半以释放空间。

    来源:华为云社区  作者:大史不说话

  • 相关阅读:
    Hibernate中使用@Lob 注解保存String[] 问题
    具体解释Java虚拟机类载入
    POJ 2631 Roads in the North(树的直径)
    MySQL远程訪问的两个问题
    org.hibernate.LazyInitializationException could not initialize proxy-no Session的解决
    博客搬家啦!
    hdu 5015 233 Matrix (矩阵高速幂)
    Flink内存管理源代码解读之基础数据结构
    UML图与机房收费系统实例
    TextView设置成仅仅读
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165827.html
Copyright © 2020-2023  润新知