野生前端的数据结构基础练习(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时,将存储空间减半以释放空间。

原文地址:http://blog.51cto.com/13869008/2299065

时间: 2024-09-28 21:54:43

野生前端的数据结构基础练习(2)——队列的相关文章

野生前端的数据结构基础练习(8)——图

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/graph 一.图的基本知识 基本概念 图是由边的集合和点的集合组成的.如果图的边有方向(或者说图中的顶点对是有序的)则成为有向图,如果边没有方向则称为无向图. 基本建模 图可以用来对现实中许多事物进行建模.比如交通流量,计算机网络等. 二

野生前端的数据结构基础练习(3)——链表

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/List 链表的基本知识 特点: 链表由节点组成,每个节点增加一个对象的引用指向它的后继节点.链表也就是将一个线性表转换为一个存储空间上不连续,而在抽象层面可连续访问的表. 用途: 更快的插入和删除,因为只需要操作插入删除位置相邻元素即可,

野生前端的数据结构基础练习(5)——散列

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Hash 散列的基本知识 定义 哈希表是一种根据关键码去寻找值的数据映射结构,最直观的应用就是字典(现实的字典,不是数据结构的字典概念). 特点: 插入,删除,取用较快,查找较慢(例如查询最值,需要借助其他数据结构来提升效率). 散列函数应

野生前端的数据结构基础练习(6)——集合

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Set [TOC] 集合的基本知识 定义: 集合Set是一种不包含不同元素的数据结构,主要特性包括无序性和单一性,即集合中的成员是无序的,同时也是不重复的. 基本练习 实现一个自定义的cSet类(避免与原生的Set类冲突),包含以下方法:

野生前端的数据结构基础练习(7)——二叉树

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/btree 一.二叉树的基本知识 基本概念 一棵树最上面的点称为根节点,如果一个节点下面连接多个节点,那么该节点称为父节点,下面的节点称为子节点,二叉树的每一个节点最多有2个子节点,一个节点子节点的个数称为度,二叉树每个节点的度只能是0,1

学习java数据结构基础知识之队列

队列是先进先出. 利用java语言实现队列代码: /* * 队列 */ public class Queue { private int maxSize; //最大队列 private long[] queArray; //队列数组 private int front; //队头 private int rear; //队尾 private int nItems; //当前队列元素个数 //构造函数 public Queue(int s) { super(); this.maxSize = s;

数据结构基础(7) --循环队列的设计与实现

队列 队列简称队, 也是一种操作受限的线性表, 只允许在表的一端进行插入, 而在表的另一端进行删除.其特点为"先进先出(FIFO)",故又称为先进先出的线性表,简单队列如图所示: 循环队列 顺序队列有一个先天不足, 那就是空间利用率不高, 会产生"假溢出"现象,即:其实队列中还有空闲的空间以存储元素, 但我们在判断队列是否还有空间时, 队列告诉我们队列已经满了, 因此这种溢出并不是真正的溢出, 在data数组中依然存在可以放置元素的空位置, 所以说这是一种"

野生前端的数据结构练习(1)——栈

习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Stack 基本练习 根据栈的特性实现一个Stack类,并在后续题目中需要用栈时使用它. 编写一个函数unitTrans(num, unit),num为一个10进制数字,unit要转换的进制数,求转换结果. 编写一个函数recursion(num),num为一个10进制数字,要求输出n

野生前端的数据结构练习(12)贪心算法

参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/GreedyAlogrithm 一.贪心算法 贪心算法属于比较简单的算法,它总是会选择当下最优解,而不去考虑单次递归时是否会对未来造成影响,也就是说不考虑得到的解是否是全局最优.在很多实际问题中,寻找全局最优解的代价是非常大的,这时候就可以通过求次优解来解决问题,这种思想其实在软件工程中很常见,例如React中著名的DOM Diff算法中需要对比两棵DOM树,树的完