首页 果壳精灵教程 当前文章

【新手入门】第 13 讲:复杂数据结构

xLeaves(xxrpa) 发布于 2022年06月23日 00:42:42


除了数组之外,果壳精灵还支持多种数据格式,例如链表、哈希表(字典)、AVL树,以及自定义的数据类型和类(面向对象编程)。


哈希表:

哈希表在其他语言里也叫字典或者MAP,这种数据结构类似数组,但不使用数字来表示子元素数据,而是使用一个字符串来表示子元素。

这就赋予了哈希表更强大的灵活性,但这也让哈希表在使用的时候比数组稍微麻烦一些。

哈希表使用一个字符串爱表示元素索引,它的值也是一个字符串,因此这种数据被称为键值对数据,键就是子元素的名字,值就是子元素的数据。


要使用哈希表,首先我们需要使用【Hash_New】函数创建一个哈希表,这个函数需要传递一个参数,来表示这个哈希表预申请的数据数量,我们可以传递 0,这样它会使用一个最小值 100 来代替它:

Function Main() As Long
	Dim 哈希表 As Table = Hash_New(0)
End Function

创建完哈希表之后,我们就可以设置和获取哈希表的数据了:

Function Main() As Long
	Dim 哈希表 As Table = Hash_New(0)
	Hash_Set(哈希表, "Key", "Value")
	TracePrint Hash_Get(哈希表, "Key")
End Function

通过【Hash_Count】可以获取哈希表中键值对的数量:

Function Main() As Long
	Dim 哈希表 As Table = Hash_New(0)
	Hash_Set(哈希表, "Key", "Value")
	TracePrint Hash_Count(哈希表)
End Function

也可以删除一个键值对:

Function Main() As Long
	Dim 哈希表 As Table = Hash_New(0)
	Hash_Set(哈希表, "Key", "Value")
	Hash_Del(哈希表, "Key")
	TracePrint Hash_Count(哈希表)
End Function

要遍历一个哈希表比较麻烦,但也是能够做到的:

Function Main() As Long
	Dim 哈希表 As Table = Hash_New(0)
	Hash_Set(哈希表, "Key1", "Value1")
	Hash_Set(哈希表, "Key2", "Value2")
	Hash_Set(哈希表, "Key3", "Value3")
	Dim sKeys As String = Hash_GetKeys(哈希表, "|")
	Dim arrKeys() As String
	Split(sKeys, "|", arrKeys)
	For i As Long = 1 To UBound(arrKeys)
		TracePrint arrKeys(i) & " : " & Hash_Get(哈希表, arrKeys(i))
	Next
End Function

哈希表需要在不再使用的时候释放掉,否则会一直占着一块内存,如果在循环里不停的创建哈希表不释放的话,电脑的内存可能会被快速占满,因此养成良好的编程习惯,你的程序才会更加稳定:

Function Main() As Long
	Dim 哈希表 As Table = Hash_New(0)
	Hash_Set(哈希表, "Key1", "Value1")
	Hash_Set(哈希表, "Key2", "Value2")
	Hash_Set(哈希表, "Key3", "Value3")
	Dim sKeys As String = Hash_GetKeys(哈希表, "|")
	Dim arrKeys() As String
	Split(sKeys, "|", arrKeys)
	For i As Long = 1 To UBound(arrKeys)
		TracePrint arrKeys(i) & " : " & Hash_Get(哈希表, arrKeys(i))
	Next
	Hash_Free(哈希表)
End Function


关于哈希表的操作函数,在【命令大全 - 标准库 - 哈希表操作】分类下。


链表:

链表是一组数据相互链接组成的表数据结构,它和数组很类似,但每个元素都额外记住了它的前一个元素和后一个元素。

因此这种表的插入操作非常灵活,而且速度很快。

在学习初期不需要对这种数据类型太过在意,它主要用于特定需要优化的场合。

链表相对来说没有哈希表那么常用,关于链表的操作函数,在【命令大全 - 标准库 - 链表操作】分类下。


AVL树:

AVL树实际上并不是一种真正的树形数据结构,而是利用AVL树来加速查表的类似哈希表的数据结构。

你可以理解为这是一种二分查找法来加速查找元素速度的哈希表,这种数据的查表速度非常快,也是用于特定优化场合的。

平时可以将它当做哈希表使用,而且 AVL 树的遍历操作比哈希表更简单:

Function Main() As Long
	Dim AVL As AVLTree = Tree_New()
	Tree_Set(AVL, "Key1", "Value1")
	Tree_Set(AVL, "Key2", "Value2")
	Tree_Set(AVL, "Key3", "Value3")
	Dim pNode As Long = Tree_First(AVL)
	Do Until pNode = 0
		TracePrint Tree_GetData(pNode)
		pNode = Tree_Next(pNode)
	Loop
End Function

在操作上,AVL树有点类似于链表 + 哈希表的组合,可以从前向后遍历,也可以从后向前遍历:

Function Main() As Long
	Dim AVL As AVLTree = Tree_New()
	Tree_Set(AVL, "Key1", "Value1")
	Tree_Set(AVL, "Key2", "Value2")
	Tree_Set(AVL, "Key3", "Value3")
	Dim pNode As Long = Tree_Last(AVL)
	Do Until pNode = 0
		TracePrint Tree_GetData(pNode)
		pNode = Tree_Prev(pNode)
	Loop
End Function

当然,这里前后的概念并不意味着后添加的数据一定在后面,对于哈希表和AVL树来说,顺序是一个虚无的属性,并不可靠。


关于AVL树的操作函数,在【命令大全 - 标准库 - AVL树操作】分类下。


若无特殊声明,上述内容为本站原创,未经授权禁止转载!