第3章顺序存储结构的表、堆栈和队列
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章 顺序存储结构的表、堆栈和队列
C++中静态数组向系统申请一块地址连续的有限 空间的方法是使用数组定义语句“[]”。当程序运 行超出该静态数组定义的范围时,系统自动回收该静 态数组的地址空间。一个静态数组的例子如下:
产生10个随机整数存放在一静态数组中,并输出?
第3章 顺序存储结构的表、堆栈和队列
第3章 顺序存储结构的表、堆栈和队列
第3章 顺序存储结构的线性表、堆栈和队 列
3.1 顺序存储结构 3.2 表和顺序表 3.3 堆栈和顺序堆栈 3.4 队列和顺序队列 3.5 优先级队列和顺序优先级队列
第3章 顺序存储结构的表、堆栈和队列
3.1 顺序存储结构
计算机所处理的所有的数据都要存储在内存中。 计算机高级语言系统对数据的存储结构有四种:顺序 存储结构、链式存储结构、间接地址和仿真指针。其 中,顺序存储结构和链式存储结构是两种最基本和最 常用的存储结构。本节讨论顺序存储结构,其余三种 存储结构依次在4.1节、5.2节和7.1节中讨论。
时间复杂度为O(n)
第3章 顺序存储结构的表、堆栈和队列
同样定位一个数据元素的时间复杂度为O(n), 其余操作的时间复杂度则均为O(1)。
第3章 顺序存储结构的表、堆栈和队列
//
int ListSize(void)const; //返回元素的个数size
int ListEmpty(void)const; //表空返回1;否则返回0
void Insert(const Datatype& item,int pos);
int Find(Datatype& item)const;
第3章 顺序存储结构的表、堆栈和队列
对表的操作方法主要有初始化构造表、在表的某 一位置插入一个元素、在表的某一位置删除一个元素、 定位某个数据元素在表中的存储位置、取表中某个存 储位置的数据元素、判表是否为空等。用顺序存储结 构存储的表称作顺序表(SequentList)。顺序表中任意 数据元素的存取和访问可通过它的位置指针(即数组 下标)来进行。
第3章 顺序存储结构的表、堆栈和队列
new的语法格式是:名字指针=new类型名(初始化 值)。其中,初始化值可为空。
new分配动态数组的语法格式是:名字指针=new 类型名[N]。其中,N必须是有确定值的整数型常量 或变量。
delete的语法格式是:delete名字指针 delete释放动态数组的语法格式是:delete[]名 字指针 将上例改为由动态数组实现?
第3章 顺序存储结构的表、堆栈和队列
3.2.1 顺序表的类定义 综合前面的讨论可知,一个顺序表涉及的数据成
员包括数组、数组的最大元素个数和当前数组元素的 个数。顺序表的操作方法和前面讨论的表的操作方法 相同,主要有初始化构造表、在表的某一位置插入一 个元素、在表的某一位置删除一个元素、定位某个数 据元素在表中的存储位置、取表中某个存储位置的数 据元素、判表是否为空等。使用静态数组方法的顺序 表的类定义如下:
//在位置pos插入元素item //返回元素item
Datatype GetData(int pos)const;
//返回位置pos
Datatype Delete(const int pos); //删除位置pos的元素并返回
void ClearList(void);
//
};
第3章 顺序存储结构的表、堆栈和队列
第3章 顺序存储结构的表、堆栈和队列
顺序存储结构是计算机中的一种最基本和最主要 的数据存储结构。在顺序存储结构中,用户向系统申 请一块地址连续的有限空间用于存储数据元素集合, 这样,任意两个在逻辑上相邻的数据元素在物理上也 必然相邻。在C++中,向系统申请一块地址连续的有 限空间的方法是使用数组。数组有静态数组和动态数 组两种。不论是静态数组还是动态数组,其功能都是 向系统申请一块地址连续的有限空间,只是使用的方 法不同。
}
Void SeqList::ClearList(void){ Size=0;}
第3章 顺序存储结构的表、堆栈和队列
3.2.3 一、顺序表上插入算法的效率分析
顺序表上的插入和删除是顺序表类中时间复杂度
最高的成员函数。顺序表上的插入过程的图示如图所
示:
0
12
34
5 6 7 MaxListSize - 1
第3章 顺序存储结构的表、堆栈和队列
//删除指定位置pos
Datatype SeqList::Delete(const int pos) {
if(size==0) {
cout<<"顺序表已空无元素可删!"<<endl; exit(0); } if(pos<0||pos>size-1)//删除元素序号必须在0至size-1之间 { cout<<"参数pos越界出错!"<<endl; exit(0); }
第3章 顺序存储结构的表、堆栈和队列
//判顺序表空否,为空返回1;不空返回0 int SeqList::ListEmpty(void)const{ if(size==0)return 1; else return 0; }
第3章 顺序存储结构的表、堆栈和队列 //在指定位置pos插入一个数据元素item void SeqList::Insert(const Datatype& item,int pos)
} for(i=size-1;i>=pos;i++)
data[i+1]=data[i]; data[pos]=item;//在pos位置插入item size++;//数据元素个数size加1 }
第3章 顺序存储结构的表、堆栈和队列
//定位元素item的位置,返回值为item在顺序表中的位置;返 回值为-1
第3章 顺序存储结构的表、堆栈和队列
//返回顺序表中位置pos上的元素。 Datatype SeqList::GetData(int pos)const {
if(pos<0 ||pos>size-1)//取的元素序号必须在0至size-1之间 {
cout<<"参数pos越界出错!"<<endl; exit(0); } return data[pos]; }
时间复杂度即为O(n)
第3章 顺序存储结构的表、堆栈和队列
二、顺序表上删除算法的效率分析
顺序表上的删除过程的图示如图所示:
0
1
23
4
56
7
MaxListSize -1
data
10 11 12 13 14 15 16
---
Pos=3
Size=7
0
1
23
4
56
7源自文库
MaxListSize-1
data
10 11 12 14 15 16
//在位置pos插入元素item {int i=0;
if(size==MaxListSize){ cout<<"顺序表已满无法插入!"<<endl; exit(0);
}
第3章 顺序存储结构的表、堆栈和队列
if(pos<0 || pos>size){ cout<<"参数pos越界出错!"<<endl; exit(0);
---
Size=6 temp 13
( b 删) 除一个数据元素
第3章 顺序存储结构的表、堆栈和队列
在顺序表中删除一个数据元素时,算法中时间复 杂度最高的部分也是循环移动数据元素。循环移动数 据元素的效率和删除数据元素的位置pos有关,最坏情 况 是 pos=0 , 需 移 动 size-1 个 数 据 元 素 ; 最 好 情 况 是 pos=size-1,需移动0个数据元素。设Qi是在第i个存储 位置删除一个数据元素的概率,设顺序表中已有的数 据元素个数为n,当在顺序表的任何位置上删除数据元 素的概率相等时,有Qi=1/n,则向顺序表删除一个数据 元素时所需移动的数据元素的平均次数为:
int SeqList::Find(Datatype& item)const {
if(size==0)return -1; int i=0; while(item!=data[i]&& i<size) i++;//寻找item if(i<size)return i; else return -1; }
3.2.2 顺序表的类实现 顺序表类SeqList的实现如下: //构造函数。置顺序表的数据元素个数size为0 SeqList::SeqList(void){size=0;} // SeqList::~SeqList(void){} //返回顺序表的数据元素个数size int SeqList::ListSize(void)const {return size;}
第3章 顺序存储结构的表、堆栈和队列
从示例可知,静态数组存储空间的申请和释放由系 统自动完成,动态数组存储空间的申请和释放由用户通 过调用系统函数完成。
设要存储的数据元素为a0,a1,a2,a3,a4,a5,顺序存储结 构(不论是用静态数组还是用动态数组)向系统申请了 MaxSize个数据元素的存储空间,data为数组名,size为 数组的当前存储位置,即数组元素个数。其内存结构示 意图如图3―1所示。
data 19 11 21 20 15 16
---
pos=3
size=6
0 1 2 3 4 5 6 7 MaxListSize - 1
data 19 11 21 13 20 15 16
---
Pos=3
Size=7
item 13
( a ) 插入一个数据元素
第3章 顺序存储结构的表、堆栈和队列
在顺序表中插入一个数据元素时,算法中时间复 杂度最高的部分是循环移动数据元素。循环移动数据 元素的效率和插入数据元素的位置pos有关,最坏情况 是pos=0,需移动size个数据元素;最好情况是pos=size, 需移动0个数据元素。设Pi是在第i个存储位置插入一个 数据元素的概率,设顺序表中的数据元素个数为n,当 在顺序表的任何位置上插入数据元素的概率相等时, 有Pi=1/(n+1),则向顺序表插入一个数据元素时所需 移动的数据元素的平均次数为:
当程序运行退出主函数时,系统将自动回收分配 给静态数组temp的地址空间。
C++中动态数组向系统申请一块地址连续的有限 空间的方法是使用动态存储分配函数。动态数组存储 空间的回收方法是当不再需要该动态数组时,使用动 态存储释放函数。C++中动态存储分配函数用new,动 态存储释放函数用delete。new能自动计算要分配类型 的空间大小并自动返回正确的指针类型。delete能自动 释放由new分配的存储空间。
第3章 顺序存储结构的表、堆栈和队列
class SeqList { private:
Datatype data[MaxListSize]; //抽象类型Datatype定义的数组
int size;//
第3章 顺序存储结构的表、堆栈和队列
public:
SeqList(void);
//
~SeqList(void);
其中n是表的长度,n=0的表称作空表。从数据元素之间的逻辑 关系来划分,数据结构可分为线性结构和非线性结构两种。线性结构 是指数据元素之间的逻辑关系为除第一个元素和最后一个元素外,每 个数据元素都只有一个前驱元素和一个后继元素。
线性表是最简单的一种线性结构。线性表中相邻元素之间存在 着顺序关系,将 ai-1 称为 ai 的直接前趋,ai+1 称为 ai 的直接后继。就 是说:对于ai,当 i=2,...,n 时,有且仅有一个直接前趋 ai-1.,当i=1, 2,...,n-1 时,有且仅有一个直接后继 ai+1,而 a1 是表中第一个元素, 它没有前趋,an 是最后一个元素无后继。
第3章 顺序存储结构的表、堆栈和队列
图3―1 顺序存储结构内存结构示意图
第3章 顺序存储结构的表、堆栈和队列
3.2 线性表和顺序表
线性表(List)是一种可在任意位置进行插入和删除操作的由n (n≥0)个相同类型数据元素组成的线性结构。通常记为:
(a1,a2,… ai-1,ai,ai+1,…an)
第3章 顺序存储结构的表、堆栈和队列
Datatype temp=data[pos]; //从pos至size-2逐个元素左移,data[size-1]移入data
[size-2]中 for(int i=pos+1;i<=size-1;i++)data[i-1]=data[i]; size--;//数据元素个数size减1 return temp;