线性表ADT
取自严蔚敏版数据结构
ADT List{
数据对象:D = {ai | ai ∈ ElemSet, i = 1,2,…, n, n>= 0}
数据关系:R1 = {<ai-1, ai> | ai-1, ai∈D, i = 2, …, n}
基本操作:InitList(&L)
Length(L)
LocateElem(L, e)
GetElem(L,i)
ListInsert(&L, i, e)
LIstDelete(&L,i,&e)
PrintList(L)
Empty(L)
DestroyList(&L)
}ADT List
线性表之顺序表
顺序表——用顺序存储的方式来实现线性表的存储。属于一种逻辑结构。
初始化:动态分配和静态分配
动态分配
L.data = (ElemType *)malloc(sizeof(ElemType) * MaxSize);
malloc函数返回一个指针,需要强制转型为定义的数据元素类型指针,参数指明要分配多大的连续内存空间。
头文件为 <stdlib.h>
静态分配
其实就是一个数组,从一开始就固定了大小,不易扩展。
插入与删除
在第i的位置上插入
移动(n - i +1)
最好情况 | i = n+1 | 移动0次 |
---|---|---|
最差情况 | i = 1 | 移动n次 |
平均情况 | 1/n∑(n - i + 1) | 移动n/2次 |
删除第i个元素
移动(n - i )
最好情况 | i = n | 移动0次 |
---|---|---|
最差情况 | i = 1 | 移动n-1次 |
平均情况 | 1/n∑(n - i) | 移动(n-1)/2次 |
插入与删除的区别在于,删除只能删去n个元素,而插入可以插到n+1个位置。因此,介于此去记忆理解就可以得到以上结果。
线性表之链表
链表就是使用链式存储实现的结构,同样也是一种存储结构。说到这,其实自然就想到了逻辑结构,线性表就是一个逻辑结构。那么如何识别两种结构?
- 逻辑结构是针对问题描述所形成的,他的对象就是问题本是,与计算机,与存储结构无关。
- 存储结构,又叫物理结构。那么自然就是与计算机有关的,是针对逻辑结构所做出的存储选择,是逻辑结构在计算机世界的映象,使用计算机语言实现。
- 因此区分是否为逻辑还是存储,便是探究其是否可以由多种结构存储的问题。若只是反映了数据关系,并且可以使用多种存储结构实现,那便是逻辑结构。 例如,栈有顺序栈和链栈;队列有顺序队列和链队列等等。
在此特意说说静态链表。为啥呢?因为我发现做了几个简单的选择题,居然栽在这上面了。
- 静态链表的出现,并不是为了解决顺序表的某个缺点而产生的。因此它不同时具备链表的优点和顺序表的优点。
- 静态链表的出现,是为了那些没有指针的高级语言,用数组来实现这种结构。
操作受限的线性表
栈
常用的一个逻辑结构,也是一个操作受限的线性表。操作受限就是指的只能一边进,同时也是那一边出。就像一个胡同一样。相关应用有括号匹配,表达式求值,递归,进制转化,迷宫求解,函数调用等等。
表达式求值
初学认为这个有点绕,其实后知后觉,这个不难。表达式求值=中缀转后缀 + 后缀的计算
中缀转换成后缀
给定中缀,转成后缀。通过一个符号栈进行。记住,符号进栈即可。
后缀表达式的计算
通过一个对象栈进行。记住,数字进栈即可。
综上,后缀表达式求值(做题)就是将给定的一个中缀表达式先手写成后缀表达式,然后就进栈操作,就可以将对象栈写出来了。至于符号栈,如果采取一致原则,那么中缀还是后缀,从左往右就行了。
队列
队列就是排队问题,一个接着一个,只要你排上队了,那你必须排完(不准跑,即使队伍很长),意思是必须从第一(front)的位置那出队。就好比是一个独木桥。
说着说着,有个很简单的问题:那就是循环队列是什么结构呢?
分析:能用链队列实现吗?不可以,那么他就是逻辑结构。
循环队列是因为循环队列假溢出的问题才想到的一个解决方法。因此他就是顺序队列。使用模的数学知识,解决假溢出问题。使得顺序队列的物理上的问题转成一个逻辑上的闭环,从而解决了假溢出问题。
不过,其实又引出新问题,那就是空与满的问题?如何去判断呢?
常用解决问题方法有三个:1. 加一个标志位tag 2. 加一个结构体变量size 3. 空一个单元
其实三个方法都挺简单的,我就不写了。
不过,其实这里面有一个问题,那就是空一个的方法。如何做到最后一个不用呢?
其实也很简单,就是判断满的条件设置好就行了。谈到满,那空呢?那便是“如何开始呢?”的问题了。
这就是一个做题中出现过的一个问题,乍一做,不对味(当然其实不难)但其实仔细分析一下,还是有点意思的。发现,最终判满和开始的front和rear的位置问题,都是由进队和入队决定的。此话怎讲?
这就要回顾入队和出队问题了,其实出队和入队就两种情况,先赋值后移动还是先移动后赋值 理解这个,就可以理解整个问题了。这里就不想打字了,附图如下:
串
其实就是只能由字符组成的序列,也是线性表的一种。
串,即字符串是由零个或多个字符组成的有限序列
对比一下,线性表定义
线性表是由相同的数据类型的n(n >= 0)个数据元素的有限序列
难理解的话其实就是模式匹配问题,多看看书就会理解了。做选择题的话其实就是写出数组的问题。掌握这里就行了。搞懂前缀和后缀关系就可以了,这里也附图了,不想打字了:
广义表
对线性表的一种推广,也结合了树。具有共享和递归特性。
也不难,记住常规操作即可。对了,考考你:你会画广义表的头尾链表存储结构和扩展线性链表存储结构吗?
至此,就分享到这里了。
感谢您能看到这里,文中的难易评价均是笔者水平比较,并不是骄傲,我也是勤勤恳恳的学过来的。希望和大家一同进步。如果对你有用,我会很开心;如果有错误也请指出,感谢!!!
最后,希望动动你的小手指☀