上篇数据结构那些事(一)已经介绍了数组,列表和栈。这篇我们将介绍队列,链表,字典。

队列也是一种列表,遵循先进先出的规则。

队列的两种主要操作是:向队列中插入新元素和删除队列中的元素。入队操作在队尾插入新元素,出队在队头删除元素。 接下来,我们来设计一个队列Queue类:

function Queue(){this.dataStore = [];//存储this.enqueue = enqueue;//入队this.dequeue = dequeue;//出队this.front = front;//队首this.back = back;//队尾this.toString = toString;//显示队列元素this.empty = empty;//清除
}
复制代码

实现上面的操作方法:

function enqueue(e){this.dataStore.push(e);
}
function dequeue(e){this.dataStore.shift(e)
}
function front(){return this.dataStore[0]
}
function back(){return this.dataStore[this.dataStore.length - 1]
}
function toString(){let retStr = "";for (let i = 0; i<this.dataStore.length; ++i){retStr += this.dataStore[i] + "\n";}return retStr;
}
function empty(){if(this.dataStore.length === 0){return true;}else{return false;}
}
复制代码

上面我们实现了一个基础的队列。但现实生活中,可能会出现类似军人优先,重病患优先这样的场景,那样我们上面的队列就无法满足了。这时,我们需要一个优先队列。 从优先队列中删除元素时,需要考虑优先权的限制。我们来定义一下存储在队列中的元素:

function Person(name, code){this.name = name;this.code = code; //表示优先级,越小优先级越高
}
复制代码

现在,需要重新定义dequeue()方法。

function dequeue(){let p = this.dataStore[0].code;for(let i =1 ; i < this.dataStore.length; ++i){if(this.dataStore[i].code < p){p = i}}return this.dataStore.splice(p, 1);
}
复制代码

链表:有时候我们使用数组效率比较低的时候就可以考虑使用链表。当然,如果你的场景需要随机访问,数组仍然比链表更合适。

链表元素依靠相互之间的关系进行引用。遍历链表,就是跟着链表,从链表的首元素一直走到尾元素,链表的尾元素一般指向null。

下图演示了在eggs后插入cookies操作

下图演示了删除操作从上面的几张图,我们能直观的感受到,链表做这些插入和删除操作比数组要便捷的多。因为数组执行插入删除操作时还需要对应的改变数组中其他元素的索引。而链表只需要改变对应节点的指向即可完成操作,两者不可同日而语。

明白了链表的好处,接下来我们来设计实现一个链表:

我们设计的链表包含两个类。Node类用来表示节点,LinkedList类提供插入,删除,显示元素等方法。

function Node(e){this.element = e;this.next = null;
}
function LList(){this.head = new Node("head");this.find = find; //遍历链表,查找给定数据this.findPrev = findPrev; //遍历链表,查找给定数据前面一个节点this.insert = insert; //插入一个节点this.remove = remove; //删除this.display = display; //显示
}
复制代码

实现上面的方法:

function find(e){let currNode = this.head;while(currNode.element !== e){currNode = currNode.next;}return currNode;
}function insert(newEl, e){let newNode = new Node(newEl);let current = this.find(e);newNode.next = current.next;current.next = newNode;
}function display(){let currNode = this.head;while(currNode.next !== null){console.log(currNode.next.element);corrNode = currNode.next;}
}function findPrev(e){let currNode = this.head;while(currNode.next !== null && currNode.next.element !== e){currNode = currNode.next;}return currNode;
}function remove(e){let prev = this.findPrev(e);if(prev.next !== null){prev.next = prev.next.next;}
}
复制代码

上面定义的基础链表存在一个问题:很难从后向前遍历

这时,我们可以考虑实现一个双向链表:

按照上图的理解:我们先要给Node类增加一个先前连接的属性

function Node(element) {this.element = element;this.next = null;this.previous = null;
}
复制代码

我们还要修改对应的insert方法,因为他现在需要建立两个连接

function insert(newElement, item) {var newNode = new Node(newElement);var current = this.find(item);newNode.next = current.next;newNode.previous = current;current.next = newNode;
}
复制代码

双向链表的remove()方法比单向链表的效率更高,因为不需要查找前驱节点了。

function remove(item) {var currNode = this.find(item);if (!(currNode.next == null)) {currNode.previous.next = currNode.next;currNode.next.previous = currNode.previous;currNode.next = null;currNode.previous = null;}
}
复制代码

还有一种链表是循环链表:和单向链表类似,唯一的区别是,在创建循环列表时,让其头结点的next属性指向它本身。

创建循环列表,我们只需要改变一下LList类即可:

function LList() {this.head = new Node("head");this.head.next = this.head; //让头结点的next指向它自己this.find = find;this.insert = insert;this.display = display;this.findPrevious = findPrevious;this.remove = remove;
}
复制代码

字典:字典是一种以键值对形式存储数据的数据结构。

JavaScript中的Object类就是以字典形式设计的。所以字典的实现就像对象一样,感觉实在没什么值得写的,这里给一个demo。

function Dictionary(){this.dataStore = new Array();
}function add(key, value){this.dataStore[key] = value;
}function find(key){return this.dataStore[key];
}function remove(key){delete this.dataStore[key]
}function show(){for( let key in Object.keys(this.dataStore)){console.log(key + this.dataStore[key])}
}
复制代码

转载于:https://juejin.im/post/5d00b3fff265da1bb67a1121

数据结构那些事(二)相关推荐

  1. 20172328《程序设计与数据结构》实验二:树

    20172328<程序设计与数据结构>实验二:树 课程:<软件结构与数据结构> 班级: 1723 姓名: 李馨雨 学号:20172328 实验教师:王志强老师 实验日期:201 ...

  2. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  3. 20172310 《程序设计与数据结构》实验二报告

    20172310 2017-2018-2 <程序设计与数据结构>实验二报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 仇夏 学号:20172310 实验教师:王志 ...

  4. 猿创征文|【算法入门必刷】数据结构-栈(二)

    [算法入门必刷]算法入门-数据结构-栈(二) 前言 算法入门刷题训练 题目AB2: 栈的压入.弹出序列 题目分析 理论准备 题解 小结

  5. 数据结构自学笔记二、栈

    数据结构自学笔记二.栈 栈的定义 栈的作用 栈的顺序存储与随机存储 栈的基本功能的实现 先以顺序存储结构的栈为例. 然后再说说随机存储结构的栈吧 两栈共享空间 栈的一个重要应用--四则运算 算式的后缀 ...

  6. 29、数据结构笔记之二十九数组之硬币抛掷模拟

    29.数据结构笔记之二十九数组之硬币抛掷模拟 "人生是各种不同的变故.循环不已的痛苦和欢乐组成的.那种永远不变的蓝天只存在于心灵中间,向现实的人生去要求未免是奢望.-- 巴尔扎克" ...

  7. 数据结构与算法:二叉搜索树

    ✨数据结构与算法:二叉搜索树

  8. 数据结构实验报告(二)简单计算器(中缀转后缀)

    报告汇总之c语言数据结构报告篇(二) 简单计算器 代码区 #include <stdio.h> #include <stdlib.h>char S[100]; char S2[ ...

  9. 数据结构与算法——二叉平衡树(AVL树)详解

    文章目录 AVL树概念 不平衡概况 四种平衡旋转方式 RR平衡旋转(左单旋转) LL平衡旋转(右单旋转) RL平衡旋转(先右后左双旋转) LR平衡旋转(先左后右单旋转) java代码实现 总结 AVL ...

最新文章

  1. C: Answers to “The C programming language, Edition 2”
  2. 对“纯手工编写的第一个Hibernate程序”的改进
  3. Python 实现猜年龄小游戏
  4. nginx lua指令
  5. boost::type_index模块实现一个类型中获得简短的和人类可读的类型名称
  6. python 绘制时频图 plt.specgram
  7. oracle dba开头的表,KU$开头的表是什么表?
  8. STM32学习第三课:STM32 c语言学习基础3(内存操作、指针、结构指针)
  9. inner/left/right inner
  10. SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证
  11. 拓端tecdat|R语言对HullWhite短期利率模型仿真
  12. php环境用什么服务器好些_PHP环境部署,Linux真的比Windows好吗?
  13. 舞台音效控制软件_音频控制软件哪个好?
  14. VC++_2010_学习版_下载教程
  15. matlab2010 simulink,张德丰 (2010) MATLAB/Simulink建模与仿真实例精讲. 机械工业出版社, 北京....
  16. 基于android个人记账本的软件设计,基于Android的个人记账软件的设计与实现-开题报告...
  17. simulink仿真之阶梯步长
  18. java新闻网站项目描述_基于jsp的新闻网站-JavaEE实现新闻网站 - java项目源码
  19. 蒋涛对话王成录:开发者的黄金十年
  20. mbp touchbar设置_【macbook pro小技巧】 敲代码时如何让touchbar一直显示fn(f1 - f12)键...

热门文章

  1. 搭建samba文件共享服务
  2. selenium自动化测试框架_selenium自动化测试框架之PO设计模式
  3. c语言获取按键痕迹,c语言获得键盘的按键
  4. c6011取消对null指针的引用_C++中的引用
  5. 未找到要求的 from 关键字_性能优化|这恐怕是解释Explain关键字最全的一篇文章
  6. android 获取位置数据库,尝试从webview获取位置时,Android“SQLite数据库无法从/CachedGeoposition.db加载”错误...
  7. HTML怎么让正方形转动,第十讲:html5中canvas实现正方体的动态旋转
  8. winpcap基本原理及常见应用_数字图像处理原理及应用教学大纲
  9. pcb过孔漏铜_为什么PCB板在生产中会铜线脱落?
  10. linux下代码写错了怎么更改_AWS全面上市开源Linux发行版,专为容器操作系统设计...