JavaScript数据结构学习之数组、栈与队列


Posted in Javascript onMay 02, 2017

前言

数据结构就是关系,没错,就是数据元素相互之间存在的一种或多种特定关系的集合。

常用的数据结构有:

数组,队列(queue),堆(heap),栈(stack),链表(linked list ),树(tree),图(graph)和散列表(hash)

本文主要介绍的是数组、栈与队列,下面来一起看看详细的介绍吧。

一、数组

数组是平时使用最常用的数据结构,在JavaScript中数组是动态的分配大小,在这里我不会介绍JavaScript里面数组的所有的方法,而是针对数据结构这个方向谈谈所用到的方法。

创建和初始化数组

//创建空数组
var array = new Array();
//[]
//初始化数组
var array = new Array(1,2,3);
var array = Array.of(1,2,3);//ES6的方法
//[1,2,3]
//创建大小为5的数组
var array = new Array();//ES6的方法
//[undefined,undefined,undefined,undefined,undefined]
//给数组赋值
var array = new Array();
array[0] = 1 ;
array[1] = 2 ;
array[2] = 3 ;
//[1,2,3]

添加元素

往数组后添加元素

var number = [1,2,3];
number[number.length] = 4;
//[1,2,3,4]
//或者
var number = [1,2,3];
number.push(4);
//[1,2,3,4]

往数组前面添加元素

var number = [1,2,3];
number.unshift(0);
//[0,1,2,3]
number.unshift(-2,-1);
//[-2,-1,0,1,2,3]

往数组的任意位置插入元素

运用splice方法

//在索引1后面添加2,3,4
var number = [1,5,6];
number.splice(1,0,2,3,4);
//[1,2,3,4,5,6]

删除元素

删除第一位

var number = [1,2,3];
number.shift();
//[2,3]

删除任意位置

使用splice方法删除数组任意位置的元素

var numebr = [1,2,3,4,5,6];
//如果想删除元素3
number.splice(2,1);
//[1,2,4,5,6]
//如果想删除元素4,5
number.splice(3,2);

排序

反序

var number = [3,2,1];
number.reverse();
//[1,2,3]

自然排序

var numebr = [2,3,4,1,3,7];
number.sort();
//[1,2,3,3,4,7]

自定义排序

这个自定义排序跟java里面实现comparator接口一个意思。用处可大了。

var number = [4,5,6,7,1,2,3,8,9,10,11,12,13];
number.sort();
//[1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9]

仿佛看起有点不对啊,我们应该想要的是
[1,2,3,4,5,6,7,8,9,10,11,12,13],这个时候我们就用自定义排序来解决这个问题

var number = [4,5,6,7,1,2,3,8,9,10,11,12,13];
function compare(a,b){
 if(a < b){
 return -1;
 }
 if(a > b){
 return 1;
 }
 return 0;
}
number.sort(compare);
//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

这还只是最简单的,也可以对任何对象类型进行数组排序。例如,对象Person有名字和年龄属性,我们希望根据年龄排序

var friends = [{name:'李晨',age:40},{name:'范冰冰',age:35}];
function comparePerson(a,b){
 if(a.age < b.age){
 return -1;
 }
 if(a.age > b.age){
 return 1;
 }
 return 0;
}
friends.sort(comparePerson);
//[{name:'范冰冰',age:35},{name:'李晨',age:40}]

搜索

搜索有两个方法:indexOf方法返回与参数匹配的第一个元素的索引,lastIndexOf返回与参数匹配的最后一个元素的索引。

var number = [1,3,4,3,56,6,7,4];
number.indexOf(3);//1
number.lastIndexOf(3)//3

二、栈

栈是一种遵循后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。在JavaScript中变量保存和函数调用都是用栈存储的。

首先创建一个类来表示一个栈,需要一种数据结构来保存栈里的元素。这里我们就选择刚学的数组:var items = [];
接下来,为我们的栈声明一些方法:

  1. push(elements(s)) :添加一个(或几个)新元素到栈顶
  2. pop() :移除栈顶的元素,同时返回被移除的元素
  3. peek() :获取栈顶的元素,不对栈做出任何修改
  4. isEmpty() :如果栈里没有任何元素就返回true,否则返回false;
  5. clear() :清空栈
  6. size() :返回栈元素的个数

如果上一节数组认真看了,我相信用JavaScript实现一个栈是非常简单的。在这里就直接来代码了,不用一个方法一个方法去解释了。

function Stack(){
 var items = [];
 this.push = function(element){
 items.push(element);
 }
 this.pop = function(){
 return items.pop();
 }
 this.peek = function(){
 return items[items.length-1];
 }
 this.isEmpty = function(){
 return items.length === 0;
 }
 this.size = function(){
 return items.length;
 }
 this.clear = function(){
 items = [];
 }
 this.print = funciton(){
 console.log(items.toString());
 }
}

三、队列

队列是遵循先来先服务(FIFO)原则的一组有序的项。队列在尾部添加新元素,并从顶部移除元素。最新添加的元素排在队列的末尾。

在现实生活中常见的例子就是排队。
在计算机科学中,一个常见的例子就是打印队列,先点击打印的文档会被先打印。

创建队列

同样先创建一个类来表示一个队列。需要用到的数据结构同样是数组var items = [];

声明可用的方法:

  • enqueue(element(s)) :向队尾添加一个(或多个)新的项
  • dequeue() :移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。
  • front() :返回队列中第一个元素
  • isEmpty() :如果队列中不包含元素返回true,否则返回false
  • size() :返回队列包含元素的个数

完整的Queue类

function Queue(){
 var items = [];
 this.enqueue = function(element){
 items.push(element);
 }
 this.dequeue = function(){
 return items.shift();
 }
 this.front = function(){
 return items[0];
 }
 this.isEmpty = function(){
 return items.length === 0;
 }
 this.clear = function(){
 items = [];
 }
 this.size = funciton(){
 return items.length;
 }
 this.print = function(){
 console.log(items.toString());
 }
}

优先队列

在优先队列中,元素被赋予优先级。当访问元素的时,具有最高优先级的元素先删除。优先队列具有最高进先出的行为特征。例如:医院的急救室为病人赋予优先级(这个优先级可以指病情严重的成程度),具有最高优先级的病人最先得到治疗。

实现一个优先队列有两种选项:

  • 设置优先级,然后在正确的位置添加元素;
  • 用入列操作添加元素,然后按照优先级移除它们。

我们这里采用第一种。

function PriorityQueue(){
 var items = [];
 funciton QueueElement(element,priority){
 this.element = element;
 this.priority = priority;
 }
 function comparePriority(a,b){
 if(a.priority > b.priority){
  return 1;
 }
 if(a.priority < b.priority){
  return -1;
 }
 return 0;
 }
 this.enqueue = funciton(element,priority){
 var queueElement = new QueueElement(element,priority);
 items.push(queueElement);
 items.sort(comparePriority);
 }
 //其它方法和默认的Queue实现相同
}

当然,这个enqueue的实现方法很多种,我这效率不是最高的,但是容易理解。将插入的元素根据优先级排个序,那么先出去的就是优先级最高的了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JS BASE64编码 window.atob(), window.btoa()
Mar 09 Javascript
不安全的常用的js写法
Sep 15 Javascript
js中查找最近的共有祖先元素的实现代码
Dec 30 Javascript
js中indexof的用法详细解析
Dec 24 Javascript
JS延时提示框实现方法详解
Nov 26 Javascript
使用堆实现Top K算法(JS实现)
Dec 25 Javascript
JavaScript正则表达式匹配 div  style标签
Mar 15 Javascript
js图片切换具体实现代码
Oct 13 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
Nov 08 Javascript
玩转Koa之核心原理分析
Dec 29 Javascript
Node.js从字符串生成文件流的实现方法
Aug 18 Javascript
js实现随机抽奖
Mar 19 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
May 02 #Javascript
详解webpack+es6+angular1.x项目构建
May 02 #Javascript
jQuery Tree Multiselect使用详解
May 02 #jQuery
bootstrap的常用组件和栅格式布局详解
May 02 #Javascript
Vuejs实现带样式的单文件组件新方法
May 02 #Javascript
基于bootstrap实现bootstrap中文网巨幕效果
May 02 #Javascript
老生常谈js-react组件生命周期
May 02 #Javascript
You might like
php数组去重的函数代码
2013/02/03 PHP
学习php过程中的一些注意点的总结
2013/10/25 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
2017/04/01 PHP
PHP获取访问设备信息的方法示例
2019/02/20 PHP
php抽象类和接口知识点整理总结
2019/08/02 PHP
javascript之锁定表格栏位
2007/06/29 Javascript
javascript this用法小结
2008/12/19 Javascript
Jvascript学习实践案例(开发常用)
2012/06/25 Javascript
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
jQuery实现表格的增、删、改操作示例
2019/01/27 jQuery
Vue中props的详解
2019/05/16 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
2019/08/02 Javascript
Vue如何基于es6导入外部js文件
2020/05/15 Javascript
Bottle框架中的装饰器类和描述符应用详解
2017/10/28 Python
Python实现的括号匹配判断功能示例
2018/08/25 Python
python requests使用socks5的例子
2019/07/25 Python
Django app配置多个数据库代码实例
2019/12/17 Python
PyTorch里面的torch.nn.Parameter()详解
2020/01/03 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
2020/08/07 Python
Zooplus葡萄牙:欧洲领先的网上宠物商店
2018/07/01 全球购物
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
一些网络技术方面的面试题
2014/05/01 面试题
一套比较完整的软件测试人员面试题
2012/05/13 面试题
理工科学生的自我评价
2013/12/15 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
宿舍管理制度范本
2015/08/07 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript
Redis 限流器
2022/05/15 Redis