一般的数据结构教程都是C语言写的,这让没有学过C语言直接学前端的Baby们很是难受,之前老师讲数据结构的时候实在受不了老师枯燥的讲法,但是数据结构尤为重要,所以现在自学啦~给大家推荐一本书,人民邮电出版社出版的《数据机构与算法Javascript描述》。这本书使用JavaScript来实现种种算法,且通俗易懂,适合大家学习。那么我的博客也会为系统的为大家介绍书中的数据结构和算法知识,Lison也会补充自己从其他地方学到的好的内容~
原文地址:https://www.lisonblog.cn/index.php/2016/11/03/data_structure_list/
首先我觉得要说下数据结构的定义,数据结构是指互相之间存在着一种或多种关系的数据元素和与数据元素相关操作的集合。
今天先来说第一篇——列表
首先定义一个列表类,列表的实现基于数组(由于数组的特殊性质,使得列表查找快,删除慢删除慢)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
function
List
(
)
{
this
.
listSize
=
0
;
this
.
pos
=
0
;
this
.
dataStore
=
[
]
;
this
.
addElement
=
addElement
;
//在列表末尾添加一个元素
this
.
clear
=
clear
;
//清空列表
this
.
showElement
=
showElement
;
//显示列表元素
this
.
insert
=
insert
;
//在列表中插入元素的高级方式
this
.
remove
=
remove
;
//移除某个元素
this
.
find
=
find
;
//查找元素,getType参数用于指定返回值的类型
this
.
findElementIndex
=
findElementIndex
;
//查找元素的索引值
this
.
front
=
front
;
//将列表当前位置移动到第一个元素
this
.
end
=
end
;
//将列表当前位置移动到最后一个元素
this
.
prev
=
prev
;
//将列表当前位置向前移动一位
this
.
next
=
next
;
//将列表当前位置向后移动一位
this
.
length
=
length
;
//返回列表长度
this
.
currPos
=
currPos
;
//返回当前位置
this
.
moveTo
=
moveTo
;
//将当前位置移动到指定位置
this
.
getElement
=
getElement
;
//获取元素引用
this
.
contains
=
contains
;
//判断该元素是否在列表中
}
|
下面我们来一一实现其中的方法:
1
2
3
4
5
6
|
function
addElement
(
e
)
{
//这里是简单的在列表末尾添加一个元素的方法
this
.
dataStore
[
this
.
listSize
++
]
=
e
;
/*注意这里的this.listSize++,不能写成++this.listSize,
*因为这里要先获取当前列表最后一个元素的坐标,再给listSize加1增加列表长度*/
}
|
1
2
3
4
|
function
clear
(
)
{
this
.
dataStore
.
length
=
0
;
//删除列表中的所有元素就是这么简单,在JavaScript中设置数组的length值为0即会删除数组中的所有元素
}
|
1
2
3
4
5
6
|
function
showElement
(
)
{
for
(
var
i
in
this
.
dataStore
)
{
console
.
log
(
this
.
dataStore
[
i
]
)
;
//这里使用console.log()方法在控制台打印出所有列表元素
}
}
|
1
2
3
4
5
6
7
8
9
10
|
function
insert
(
newElement
,
target
)
{
//这个是在目标位置插入元素的高级方法,target即你想插入新元素的位置坐标
target
=
target
||
this
.
dataStore
[
this
.
listSize
-
1
]
;
//如果你不设置target,那么默认将新元素插入在列表末尾
var
self
=
this
;
var
res
=
this
.
find
(
target
,
'index'
,
self
)
;
if
(
res
&
gt
;
-
1
)
{
this
.
dataStore
.
splice
(
res
+
1
,
0
,
newElement
)
;
}
this
.
listSize
++
;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
function
find
(
e
,
getType
)
{
//查找元素,getType参数用于指定返回值的类型
getType
=
getType
||
'index'
;
//getType默认值为'index',即返回查找元素所在位置的下标,若为'element'则返回查找的元素的引用
var
index
=
this
.
findElementIndex
(
e
)
?
this
.
findElementIndex
(
e
)
:
false
;
if
(
index
)
{
if
(
getType
==
'index'
)
{
return
index
;
}
else
if
(
getType
==
'element'
)
{
return
this
.
dataStore
[
index
]
;
}
else
{
console
.
log
(
"You must input 'getType' as 'index' or 'element' or ' '!"
)
;
}
}
else
{
return
false
;
}
}
|
1
2
3
4
5
6
7
8
9
|
function
findElementIndex
(
e
)
{
//此方法用于返回元素所在的位置坐标
for
(
var
i
=
0
;
i
&
lt
;
this
.
listSize
;
i
++
)
{
if
(
this
.
dataStore
[
i
]
==
e
)
{
return
i
;
}
}
return
false
;
}
|
1
2
3
4
5
6
7
8
9
|
function
remove
(
e
)
{
//用于删除制定元素
var
res
=
this
.
find
(
e
)
;
if
(
res
&
gt
;
-
1
)
{
this
.
dataStore
.
splice
(
res
,
1
)
;
//使用数组的splice()方法,splice()方法是个好东西,可以删除数组元素也可以插入数组元素
this
.
listSize
--
;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
|
function
front
(
)
{
this
.
pos
=
0
;
//将列表焦点置为0即把列表当前焦点置于首部
}
function
end
(
)
{
this
.
pos
=
this
.
listSize
-
1
;
//将列表焦点置为listSize-1即把列表当前焦点置于末尾
}
function
prev
(
)
{
if
(
this
.
pos
&
gt
;
0
)
{
this
.
pos
--
;
//将列表当前焦点位置向前移动一位
}
}
|
1
2
3
4
5
|
function
next
(
)
{
if
(
this
.
pos
&
lt
;
this
.
listSize
-
1
)
{
this
.
pos
++
;
//将列表当前焦点位置向后移动一位
}
}
|
1
2
3
|
function
length
(
)
{
return
this
.
listSize
;
//返回当前列表长度
}
|
1
2
3
|
function
currPos
(
)
{
return
this
.
pos
;
//返回当前焦点所在位置
}
|
1
2
3
|
function
moveTo
(
position
)
{
this
.
pos
=
position
;
//手动设置焦点位置于目标位置
}
|
1
2
3
|
function
getElement
(
e
)
{
return
this
.
find
(
e
,
'element'
)
;
//返回列表中的指定元素,这里用到了我们前面定义的find方法
}
|
1
2
3
4
5
6
7
8
|
function
contains
(
e
)
{
//判断列表中是否存在某个元素,这里也用到了我们定义的find()方法
if
(
this
.
find
(
e
)
)
{
return
true
;
}
else
{
return
false
;
}
}
|
接下来我们来实际操作,使用一下我们实现的列表类吧~
var l = new List();
l.addElement(1);
l.addElement(2);
l.addElement(3);
l.addElement(4);
l.addElement(5);
l.showElement();
console.log(“\n”);
l.insert(‘a’,4);
l.showElement();
console.log(“\n”);
l.remove(3);
l.showElement();
console.log(l.contains(3));