顺序存储结构的表、堆栈和队列.ppt
《顺序存储结构的表、堆栈和队列.ppt》由会员分享,可在线阅读,更多相关《顺序存储结构的表、堆栈和队列.ppt(81页珍藏版)》请在三一办公上搜索。
1、第3章 顺序存储结构的线性表、堆栈和队列,3.1 顺序存储结构3.2 表和顺序表 3.3 堆栈和顺序堆栈3.4 队列和顺序队列3.5 优先级队列和顺序优先级队列,3.1 顺序存储结构,计算机所处理的所有的数据都要存储在内存中。计算机高级语言系统对数据的存储结构有四种:顺序存储结构、链式存储结构、间接地址和仿真指针。其中,顺序存储结构和链式存储结构是两种最基本和最常用的存储结构。本节讨论顺序存储结构,其余三种存储结构依次在4.1节、5.2节和7.1节中讨论。,顺序存储结构是计算机中的一种最基本和最主要的数据存储结构。在顺序存储结构中,用户向系统申请一块地址连续的有限空间用于存储数据元素集合,这样
2、,任意两个在逻辑上相邻的数据元素在物理上也必然相邻。在C+中,向系统申请一块地址连续的有限空间的方法是使用数组。数组有静态数组和动态数组两种。不论是静态数组还是动态数组,其功能都是向系统申请一块地址连续的有限空间,只是使用的方法不同。,C+中静态数组向系统申请一块地址连续的有限空间的方法是使用数组定义语句“”。当程序运行超出该静态数组定义的范围时,系统自动回收该静态数组的地址空间。一个静态数组的例子如下:产生10个随机整数存放在一静态数组中,并输出?,当程序运行退出主函数时,系统将自动回收分配给静态数组temp的地址空间。C+中动态数组向系统申请一块地址连续的有限空间的方法是使用动态存储分配函
3、数。动态数组存储空间的回收方法是当不再需要该动态数组时,使用动态存储释放函数。C+中动态存储分配函数用new,动态存储释放函数用delete。new能自动计算要分配类型的空间大小并自动返回正确的指针类型。delete能自动释放由new分配的存储空间。,new的语法格式是:名字指针=new类型名(初始化值)。其中,初始化值可为空。new分配动态数组的语法格式是:名字指针=new类型名N。其中,N必须是有确定值的整数型常量或变量。delete的语法格式是:delete名字指针 delete释放动态数组的语法格式是:delete名字指针 将上例改为由动态数组实现?,从示例可知,静态数组存储空间的申请
4、和释放由系统自动完成,动态数组存储空间的申请和释放由用户通过调用系统函数完成。设要存储的数据元素为a0,a1,a2,a3,a4,a5,顺序存储结构(不论是用静态数组还是用动态数组)向系统申请了MaxSize个数据元素的存储空间,data为数组名,size为数组的当前存储位置,即数组元素个数。其内存结构示意图如图31所示。,图31 顺序存储结构内存结构示意图,3.2 线性表和顺序表,线性表(List)是一种可在任意位置进行插入和删除操作的由n(n0)个相同类型数据元素组成的线性结构。通常记为:(a1,a2,ai-1,ai,ai+1,an)其中n是表的长度,n=0的表称作空表。从数据元素之间的逻辑
5、关系来划分,数据结构可分为线性结构和非线性结构两种。线性结构是指数据元素之间的逻辑关系为除第一个元素和最后一个元素外,每个数据元素都只有一个前驱元素和一个后继元素。线性表是最简单的一种线性结构。线性表中相邻元素之间存在着顺序关系,将 ai-1 称为 ai 的直接前趋,ai+1 称为 ai 的直接后继。就是说:对于ai,当 i=2,.,n 时,有且仅有一个直接前趋 ai-1.,当i=1,2,.,n-1 时,有且仅有一个直接后继 ai+1,而 a1 是表中第一个元素,它没有前趋,an 是最后一个元素无后继。,对表的操作方法主要有初始化构造表、在表的某一位置插入一个元素、在表的某一位置删除一个元素、
6、定位某个数据元素在表中的存储位置、取表中某个存储位置的数据元素、判表是否为空等。用顺序存储结构存储的表称作顺序表(SequentList)。顺序表中任意数据元素的存取和访问可通过它的位置指针(即数组下标)来进行。,3.2.1 顺序表的类定义 综合前面的讨论可知,一个顺序表涉及的数据成员包括数组、数组的最大元素个数和当前数组元素的个数。顺序表的操作方法和前面讨论的表的操作方法相同,主要有初始化构造表、在表的某一位置插入一个元素、在表的某一位置删除一个元素、定位某个数据元素在表中的存储位置、取表中某个存储位置的数据元素、判表是否为空等。使用静态数组方法的顺序表的类定义如下:,class SeqLi
7、stprivate:Datatype dataMaxListSize;/抽象类型Datatype定义的数组 int size;/数据元素个数,public:SeqList(void);/构造函数 SeqList(void);/析构函数 int ListSize(void)const;/返回元素的个数size int ListEmpty(void)const;/表空返回1;否则返回0 void Insert(const Datatype,3.2.2 顺序表的类实现顺序表类SeqList的实现如下:/构造函数。置顺序表的数据元素个数size为0SeqList:SeqList(void)size=0
8、;/析构函数SeqList:SeqList(void)/返回顺序表的数据元素个数sizeint SeqList:ListSize(void)constreturn size;,/判顺序表空否,为空返回1;不空返回0int SeqList:ListEmpty(void)constif(size=0)return 1;else return 0;,/在指定位置pos插入一个数据元素itemvoid SeqList:Insert(const Datatype,if(possize)cout=pos;i+)datai+1=datai;datapos=item;/在pos位置插入item size+;/
9、数据元素个数size加1,/定位元素item的位置,返回值为item在顺序表中的位置;返回值为-1表示不存在int SeqList:Find(Datatype,/返回顺序表中位置pos上的元素。参数出错时退出Datatype SeqList:GetData(int pos)const if(possize-1)/取的元素序号必须在0至size-1之间 cout参数pos越界出错!endl;exit(0);return datapos;,/删除指定位置pos上的数据元素并返回Datatype SeqList:Delete(const int pos)if(size=0)coutsize-1)/删
10、除元素序号必须在0至size-1之间 cout参数pos越界出错!endl;exit(0);,Datatype temp=datapos;/从pos至size-2逐个元素左移,datasize-1移入datasize-2中 for(int i=pos+1;i=size-1;i+)datai-1=datai;size-;/数据元素个数size减1 return temp;Void SeqList:ClearList(void)Size=0;,3.2.3 一、顺序表上插入算法的效率分析 顺序表上的插入和删除是顺序表类中时间复杂度最高的成员函数。顺序表上的插入过程的图示如图所示:,19,11,21,
11、20,15,16,-,0,1,2,3,4,5,6,7,MaxListSize,-,1,data,19,11,21,13,20,15,16,-,0,1,2,3,4,5,6,7,MaxListSize,-,1,data,pos=3,size=6,Pos=3,Size=7,13,item,(,a,),插入一个数据元素,在顺序表中插入一个数据元素时,算法中时间复杂度最高的部分是循环移动数据元素。循环移动数据元素的效率和插入数据元素的位置pos有关,最坏情况是pos=0,需移动size个数据元素;最好情况是pos=size,需移动0个数据元素。设Pi是在第i个存储位置插入一个数据元素的概率,设顺序表中的
12、数据元素个数为n,当在顺序表的任何位置上插入数据元素的概率相等时,有Pi=1(n+1),则向顺序表插入一个数据元素时所需移动的数据元素的平均次数为:,时间复杂度即为O(n),二、顺序表上删除算法的效率分析,顺序表上的删除过程的图示如图所示:,Size=7,10,11,12,13,14,15,16,-,0,1,2,3,4,5,6,7,MaxListSize,-,1,data,10,11,12,14,15,16,-,0,1,2,3,4,5,6,7,MaxListSize-1,data,Pos=3,Size=6,13,temp,(,b,),删除一个数据元素,在顺序表中删除一个数据元素时,算法中时间复
13、杂度最高的部分也是循环移动数据元素。循环移动数据元素的效率和删除数据元素的位置pos有关,最坏情况是pos=0,需移动size-1个数据元素;最好情况是pos=size-1,需移动0个数据元素。设Qi是在第i个存储位置删除一个数据元素的概率,设顺序表中已有的数据元素个数为n,当在顺序表的任何位置上删除数据元素的概率相等时,有Qi=1/n,则向顺序表删除一个数据元素时所需移动的数据元素的平均次数为:,时间复杂度为O(n),同样定位一个数据元素的时间复杂度为O(n),其余操作的时间复杂度则均为O(1)。,3.2.4 顺序表的应用 例31 编写一个程序向顺序表中插入5个整数值,然后以插入次序删除这5
14、个数。,思考:若向顺序表中依次插入5个字符,如何修改程序?,深化:若向顺序表中依次插入5个学生记录,如何修改程序?,3.3 堆栈和顺序堆栈,堆栈(Stack)是一种特殊的线性表,是一种只允许在表的一端进行插入和删除操作的线性表。堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。栈顶的当前位置是动态的,标识栈顶当前位置的称为栈顶指示器(或栈顶指针)。堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈。当栈中没有数据元素时称之为空栈。,根据堆栈的定义,每次进栈的数据元素都放在原当前栈顶元素之前而成为新的栈顶元素,每次退栈的数据元素都是原当前栈顶元素,这样,最后进入堆
15、栈的数据元素总是最先退出堆栈,因此,堆栈也称作后进先出表。用顺序存储结构存储的堆栈称为顺序堆栈(SequentStack)。下图是一个顺序堆栈的动态示意图,图中,最大元素个数设为6,top为栈顶指示器。,data,5,4,3,2,1,0,top,a,),图34 顺序堆栈的动态示意图(b)插入数据元素A后;(c)插入数据元素B、C、D后;(d)删除数据元素D、C后;(e)删除数据元素B、A后,(,data,5,4,3,2,1,0,(,b,),A,top,data,5,4,3,2,1,0,top,(,c,),A,B,C,D,data,5,4,3,2,1,0,(,d,),data,5,4,3,2,1
16、,0,top,(,e,),top,A,B,思考:数据元素A、B、C依次进栈,则可能的出栈有几种?,3.3.1 顺序堆栈类定义和实现 1.直接类定义和实现方法 直接定义是指直接定义顺序堆栈类,方法如下:class SeqStack,private:Datatype dataMaxStackSize;/抽象类型Datatype的数组int top;/栈顶位置指示器public:SeqStack(void)/构造函数top=0;SeqStack(void)/析构函数;,int StackEmpty(void)const/堆栈空返回1;否则返回0return(top=0);int GetSize(vo
17、id)const/读栈元素个数topreturn top;void ClearStack(void)/清空堆栈使之为初始化状态top=0;void Push(const Datatype,/把元素item入栈;堆栈满时出错退出void SeqStack:Push(Datatype item)if(top=MaxStackSize)cout堆栈已满!endl;exit(0);datatop=item;top+;,/出栈并返回栈顶元素;堆栈空时出错退出Datatype SeqStack:Pop()if(top=0)cout堆栈已空!endl;exit(0);top-;/top先减1 return
18、datatop;/然后取top位置上的元素返回,/取栈顶元素返回Datatype SeqStack:Peek(void)if(top=0)cout堆栈空!endl;exit(0);return datatop-1;/top指在栈顶的下一个位置,取top-1上的元素返回,注意:栈顶位置指示器top和顺序表中的当前元素个数size的含义完全相同,只是在堆栈中用top更能反映它的栈顶位置指示器的含义,所以在此使用了不同的名字。此外,顺序堆栈中的数组data和顺序表中的数组data也完全相同。因此我们说,顺序堆栈和顺序表的逻辑结构完全相同,只是两者允许的操作集合不同,顺序表允许在任意位置插入和删除,而
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 顺序 存储 结构 堆栈 队列

链接地址:https://www.31ppt.com/p-6035009.html