- 1、本文档共79页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
程序的设计基础13
Modern Operating System 第十三章 数据抽象 学习目标 理解数据抽象原则,了解抽象数据类型的概念 理解栈,能使用多种方法实现栈 理解队列,能使用多种方法实现队列 熟悉符号表的概念,掌握抽象符号表的接口设计原则与基本实现策略 熟悉哈希表的概念,了解哈希表设计的关键问题,并能针对具体应用问题进行具体分析 13.1 抽象数据类型 抽象的表现形式 行为抽象:函数 数据结构抽象:抽象数据类型 抽象数据类型的基本概念 仅关心类型的行为,不关心数据的具体实现细节 C 语言中的基本数据类型:仅关心如何使用数据,而不关心如何表示这些数据 抽象数据类型的划分:依据数据之间的关系 线性数据结构与非线性数据结构 线性数据结构与非线性数据结构 线性数据结构 非线性数据结构 13.2 线性表类型 线性表定义 或为空表,或为数据类型相同的一组数据,且 各元素只有一个直接前驱和一个直接后继 表头元素只有后继没有前驱 表尾元素只有前驱没有后继 线性表抽象 逻辑抽象:不关心元素的具体数据类型 物理抽象:不关心元素的存储格式 线性表操作 线性表操作 线性表应用示例 主函数 线性表的顺序表示 线性表的存储结构:结构体 元素的存储结构:数组 创生线性表 获取下一元素 获取上一元素 前插入元素 后插入元素 删除线性表与元素 获取与设置元素 获取与设置当前位置 其他辅助线性表函数 通用线性表类型 13.3 栈 栈定义 满足先进后出访问规则的数据集 栈操作集 创建新栈 入栈;出栈 清空栈 判断栈是否为空;判断栈是否为满 求栈的深度 栈操作 抽象栈的实现 对线性表的再抽象:使用线性表实现栈 元素的插入与删除操作只发生在表尾 可以发生在表头吗? 栈的创生与释放 入栈 出栈 其他辅助栈函数 后缀表达式 中缀表达式 定义:操作符位于操作数之间的算术表达式 示例:1 + 2 – 3 后缀表达式 定义:操作符位于操作数之后的算术表达式 示例:1 2 + 3 – 栈应用 使用栈编写一个简单的整数计算器,具有加减乘除和幂运算功能 ,输入“q”表示结束 栈应用 栈应用 栈应用 计算器运行时栈状态变化 程序文件的组织 主函数文件 主函数与计算器辅助函数原型与实现:main.c 抽象栈库 函数原型:stack.h 函数实现:stack.c 抽象线性表库 函数原型与数据类型定义:list.h 函数实现:list.c 13.4 队列 队列定义 满足先进先出访问规则的数据集 队列操作集 创建新队列 入队;出队 清空队列 判断队列是否为空;判断队列是否为满 求队列的长度 遍历队列 队列操作 抽象队列的实现 对线性表的再抽象:使用线性表实现队列 元素的插入操作只发生在队尾 元素的删除操作只发生在队首 队列的创生与释放 入队 出队 遍历队列 其他辅助队列函数 队列应用 实现一个简单进度表 用户可以为某个项目产生一个进度表,对于进度表中各个进度安排以字符串形式表达,已经执行完的进度在进度表中删除,新进度安排在进度表尾,当然可以浏览当前所有未执行的进度 实现策略 数据结构使用队列,队头的进度首先得到执行并从队列中删除,队尾是新加入的进度 进度信息为字符串,可以使用定长字符数组实现,不过这容易导致存储空间的浪费,也可能因数组越界而使系统运行出现异常 使用字符指针队列更好,字符串资源由系统运行时动态分配 队列应用 队列应用 队列应用 队列应用 程序文件的组织 主函数文件 主函数与队列应用函数原型与实现:main.c 抽象队列库 函数原型:queue.h 函数实现:queue.c 抽象线性表库 函数原型与数据类型定义:list.h 函数实现:list.c 13.5 符号表 非线性数据结构 线性数据结构的四个基本条件至少有一个不满足 符号表定义 可以通过特定关键字查找其对应意义的数据结构 概念上与字典类似 实现上每个元素具有键(关键字)和对应值 符号表的目的 提高查找效率,在常数时间内完成数据查找任务 抽象符号表接口设计 抽象符号表接口设计 抽象符号表接口设计 抽象符号表接口设计 确定键与值的类型 键的类型:与问题域有关 字符串的存储、查找与匹配 整数的存储、查找与匹配 值的类型:如何保证通用? 使用无型指针类型 无定义值的处理 void* UNDEFINEDVALUE = (void*)( UNDEFINEDVALUE); 为什么不使用NULL? 抽象符号表接口定义 13.6 哈希表 哈希造表 目的:获得常数时间复杂度的查找效率 关键技术:将关键字与存储地址对应起来 最好情况下,查找或插入只需要一次访问 哈希函数:元素的散列 定义:设计关系f,使关键字k与地址f(k)对应 好处:若存在关键字k,则必定位于f(k)处,无需比较即可获得该数据 哈希函数示例 整数集A:包含10个元素9
文档评论(0)