版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第二章 线性表、堆栈和队列 2.1 线性表的定义和基本操作 2.2 线性表的顺序存储结构 2.3 线性表的链接存储结构 2.4 复杂性分析 2.5 堆栈 2.6 队列,2.5 堆 栈 2.5.1 堆栈的定义和主要操作 2.5.2 顺序栈 2.5.3 链式栈 2.5.4 顺序栈与链式栈的比较 2.5.5 堆栈的应用,1、堆栈的定义 栈的定义:栈是插入和删除只能在其一端进行的线性表,并按后进先出的原则进行操作。 栈顶:进行插入、删除的一端; 栈底:另一端; 空栈:表中没有元素时。,例 线性表 (a1, a2, , a5),进栈出栈情况, 栈的后进先出性:可以对输入序列部分或全局求逆;凡符合后进先出
2、性,都可应用栈,如十进制数与其它数制的转换、递归的实现、算数表达式求值等问题。 栈的封闭性:除了栈顶元素外,其他元素不会被改变。因而,栈的封闭性非常好,使用起来非常安全。,2、堆栈的基本操作,(1)栈初始化 (2)进栈 Push (3)出栈 Pop (4)读取栈顶元素 Peek (5)判栈空 StackEmpty (6)判栈满 StackFull (7)置空栈,2.5 堆 栈 2.5.1 堆栈的定义和主要操作 2.5.2 顺序栈 2.5.3 链式栈 2.5.4 顺序栈与链式栈的比较 2.5.5 堆栈的应用,堆栈的顺序存储 使用数组存放栈元素,栈的规模必须小于或等于数组的规模,当栈的规模等于数组
3、的规模时,就不能再向栈中插入元素。 栈顶所在数组元素的下标: int top; 堆栈空: top = -1 堆栈满: top = MaxStackSize-1,栈内变化情况,顺序栈AStack的类定义 template class AStack private: int size ;/ 数组的规模 T * stackArray ; / 存放堆栈元素的数组 int top ; / 栈顶所在数组元素的下标 public: AStack ( int MaxStackSize ) / 构造函数 size = MaxStackSize ; stackArray = new T MaxStackSize
4、; top = -1 ; AStack ( ) delete stackArray ; / 析构函数,bool Push ( const T,算法 Push (A, item) / 向顺序栈A中压入一个元素item P1. 栈满? IF topsize-1 THEN (PRINT“栈满无法压入”. RETURN.) P2. 入栈 toptop1. / 更新栈顶元素的下标 Atopitem. / 压入新栈顶元素 ,堆栈变化情况,算法 Pop (A. item) / 从顺序栈A中弹出栈顶元素,并存放在变量item中 P1. 栈空? IF top -1 THEN (PRINT“栈空无法弹出”. RE
5、TURN.) P2. 出栈 itemAtop. / 保存栈顶元素值 toptop-1. / 更新栈顶元素的下标 ,堆栈变化情况,算法 Peek (A, item) / 将顺序栈A的栈顶元素存放在变量item中 P1. 栈空? IF top -1 THEN (PRINT“栈空”. RETURN.) P2. 读取栈顶元素 itemAtop. / 保存栈顶元素值 ,与pop的区别是什么?,top top-1,2.5 堆 栈 2.5.1 堆栈的定义和主要操作 2.5.2 顺序栈 2.5.3 链式栈 2.5.4 顺序栈与链式栈的比较 2.5.5 堆栈的应用,2.5.3 堆栈的链式存储,用单链表实现堆栈要
6、为每个栈元素分配一个额外的指针空间。 首先考虑栈顶对应链表的表头还是表尾。因为堆栈主要操作(插入、删除、存取)的对象是栈顶元素,若栈顶对应表尾,则每次操作的时间复杂性为O(n) ;若栈顶对应表头,则每个操作的时间复杂性是O(1),显然,栈顶对应表头是合理的。 另外,链式栈中不需要哨位结点。,链式栈LStack的类定义 template class LStack private : SLNode * top ;/ 栈顶指针指向表头 public : LStack ( ) top = NULL ; / 构造函数 LStack ( ) clear ( ) ; / 析构函数,void clear (
7、) ; / 清空栈 bool Push ( const T,算法 Push (item) / 向栈顶指针为top的链式栈中压入一个元素item P1. 创建新结点 sAVAIL. /为新结点申请空间 data(s) item. next(s) top. / 新结点的数据域存放item,指针域存放原栈顶结点的地址信息 P2. 更新栈顶指针 tops. / 更新栈顶指针,令其指向新入栈结点,算法 Pop ( item) / 从栈顶指针为top的链式栈中弹出栈顶元素,并存放在变量item中 P1. 栈空? IF top= NULL THEN (PRINT“栈空无法弹出”. RETURN.) P2.
8、出栈 itemdata(top). / 保存栈顶结点的字段值 qnext(top). / 令指针q指向次栈顶结点 AVAILtop. / 释放栈顶结点的空间 topq./ 更新栈顶指针,令其指向q所指结点 ,算法 Peek ( item) / 将栈顶指针为top的链式栈的栈顶元素存放在变量item中 P1. 栈空? IF topNULL THEN (PRINT“栈空”. RETURN.) P2. 存取栈顶 itemdata(top). / 将栈顶结点的字段值保存在变量item中 ,2.5 堆 栈 2.5.1 堆栈的定义和主要操作 2.5.2 顺序栈 2.5.3 链式栈 2.5.4 顺序栈与链式
9、栈的比较 2.5.5 堆栈的应用,顺序栈与链式栈的比较,在空间复杂性上,顺序栈必须初始就申请固定的空间,当栈不满时,必然造成空间的浪费;链式栈所需空间是根据需要随时申请的,其代价是为每个元素提供空间以存储其next指针域。 在时间复杂性上,对于针对栈顶的基本操作(压入、弹出和栈顶元素存取),顺序栈和链式栈的时间复杂性均为O(1) .,2.5 堆 栈 2.5.1 堆栈的定义和主要操作 2.5.2 顺序栈 2.5.3 链式栈 2.5.4 顺序栈与链式栈的比较 2.5.5 堆栈的应用,堆栈的应用括号匹配,高级语言程序设计中的各种括号应该匹配,例如:“(” 与 “)”匹配、“”与 “” 匹配、“”与
10、“” 匹配等。 字符串a=(b*c+free( ) 中的括号就没有匹配上,因为串中第一个关括号 “” 和最近的未匹配开括号 “(” 不匹配。,第二章 线性表、堆栈和队列 2.1 线性表的定义和基本操作 2.2 线性表的顺序存储结构 2.3 线性表的链接存储结构 2.4 复杂性分析 2.5 堆栈 2.6 队列,2.6 队列 2.6.1 队列的定义和主要操作 2.6.2 顺序队列 2.6.3 链式队列,1、队列的定义 队列的定义:队列是插入在一端进行而删除在其另一端进行的线性表。按先进先出的原则进行操作。 能进行删除的一端称为队首(front); 能进行插入的一端称为队尾(rear); 没有元素的
11、队列称为空队列。,队列的先进先出性:可以对输入序列起缓冲作用;凡符合先进先出性,都可应用队列,如操作系统中作业调度、图的广度优先搜索等问题。 队列的封闭性:和栈类似,队列的封闭性也非常好,使用起来非常安全。,2、队列的基本操作:,(1)队列初始化 (2)入队 (插入) (3)出队(删除) (4)读取队首元素 (5)判断队列是否空 (6)确定队列中元素个数 (7)置空队列,2.6 队列 2.6.1 队列的定义和主要操作 2.6.2 顺序队列 2.6.3 链式队列,队列的顺序存储 存放队列元素的数组: T qlistMaxQSize front 队首元素的数组下标 rear (要入队元素的下标)
12、队尾元素的下标加1,例 等待处理某作业进队、出队情况。,插入: rear=rear+1, 删除队首元素的方法1:令front=front+1, 删除队首元素方法2 :元素向前移动,front总等于0 插入: rear=rear+1,a1, 循环队列:很好的解决了存在的问题。,插入元素 x:,rear顺时针移动一位,rear = (rear+1) MOD MaxQSize,删除队首元素: front顺时针移动一位,front = (front+1) MOD MaxQSize;,采用环状模型来实现队列,各数据成员的意义如下: front指定队首位置,删除一个元素就将front顺 时针移动一位; r
13、ear指向元素要插入的位置,插入一个元素就将rear顺时针移动一位; count存放队列中元素的个数,当count等于MaxQSize时,不可再向队列中插入元素。 队空:count=0 队满:count=MaxQSize,顺序队列类AQueue的类声明 template class AQueue private: int front ;/ 队首所在数组元素下标 int rear ; / 新元素要插入的位置(下标) int count ; / 队列中元素个数 T *QArray ; / 存放队列元素的数组 int Size ;/ 存放队列的数组规模 public: AQueue ( int Ma
14、xQueueSize = 10 ) / 构造函数 AQueue ( void ) delete QArray ; / 析构函数,bool QInsert ( const T,算法QInsert (A, item) / 在队列A中将元素item插入队尾 QI1. 队列满? IF countsize THEN (PRINT“队列已满无法插入”. RETURN. ) QI2. 插入 Arear item. / 将新元素插入队尾 QI3. 更新 rearMOD(rear1, size). / 更新队尾下标 countcount1. / 更新队列长度 ,算法QDelete (A. item) / 删除队
15、列A的队首元素,并将其元素值赋给变量item QD1. 队列空? IF count0 THEN (PRINT “队列空无法删除”. RETURN. ) QD2. 出队 item Afront. / 将队首元素保存至item QD3. 更新 frontMOD(front1, size). / 更新队首元素下标 countcount-1. / 更新队列长度 ,算法QFront (A, item) / 读取队列A的队首元素值,并将其赋给变量item QF1. 队列空? IF count0 THEN (PRINT “队列空无法读取”. RETURN. ) QF2. 存取 item Afront. /
16、将队首元素保存至item ,F,R,F,R,(a) 创建一个队列,(b) 插入元素 a,队列运行示意图,47,F,R,F,R,(c) 插入元素b、c,(d) 取出元素 a、b、c,48,R,F,F,R,(e) 插入元素d、e、f、g、h、i,(f) 插入元素 j,49,F,R,(g) 删除所有元素,50,2.6 队列 2.6.1 队列的定义和主要操作 2.6.2 顺序队列 2.6.3 链式队列,队列的链接存储 链式队列的结构:(a1, a2, , an),链式队列LQueue的类声明 template class LQueue private: SLNode * front, * rear ;
17、 / 指向队首和队尾的指针 public: LQueue ( void ) front = rear = NULL; / 构造函数 LQueue ( void ) QClear ( ) ; / 析构函数 void QInsert ( const T,算法QInsert (item) / 将元素item插入队尾 QI1. 创建新结点 s AVAIL. data(s)item. next(s)NULL. / 为新结点申请空间,令其字段值为item,指针域为空 QI2. 队空? IF frontNULL THEN fronts. /若队列为空,令队首指针指向s ELSE next(rear)s. /
18、若队列非空,令表尾结点的next指针指向s QI3. 更新 rears. / 更新表尾指针,rear,算法QDelete (item) / 删除队首结点并将其字段值存于item QD1. 队列空? IF frontNULL THEN (PRINT “队列为空”. RETURN. ) QD2. 出队 qfront. itemdata(q). / 令指针q指向队首,并保存其字段值 frontnext(front). / 令队首指针指向原队首结点之后继结点 AVAILq. / 释放原队首结点的存储空间 QD3. 出队后队列空? IF frontNULL THEN rearNULL. / 若删除队首结点后队列为空,则令队尾指针修为空,算法QFront (item) / 读取队首元素值,并将其赋给变量item QF1. 队列空? IF frontNULL THEN (PRINT “队列空无法读
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 跨境电商排他性托管协议
- 5G+工业互联网:推动制造业高质量发展的路径研究
- 检测认证正式股权激励合同
- 2021年特教学校工作计划
- 一、输入和编辑文本教学设计初中信息技术(信息科技)七年级下册沪科版
- 学习项目二 表演艺术家的二度创作教学设计初中艺术·音乐人教版简谱2024七年级下册-人教版简谱2024
- 少儿趣味编程Scratch学科融合《抛物线运动研究之愤怒的炮弹》(教案+源文件)
- 河北省保定市涞水县高中数学 第三章 三角恒等变换 3.2 函数模型及其应用教学设计 新人教A版必修1
- 朱伯庸火神通络膏|国内外同类通络乳膏文献与专利检索综述报告
- 2026碳捕集与封存技术商业化应用的政策激励效果评估报告
- 2026年全国保密教育线上培训考试试题库及参考答案【完整版】
- 2026福建漳州闽投华阳发电有限公司招聘43人笔试参考题库及答案详解
- GB/T 47655-2026电力电子装备和系统的构网性能要求及试验方法
- GA/T 1466.1-2026智能手机型移动警务终端第1部分:技术要求
- 中信建投:未来产业投资地图系列之“可控核聚变”
- 检验科生物安全培训内容及记录
- 2025广东省深圳市中考历史真题(解析版)
- 门诊一站式服务流程建设方案
- 浙江省食用农产品批发市场食品安全主体责任清单与技术评审指南(2023版)
- 注册安全工程师考试金属冶炼(中级)安全生产专业实务复习难点详解
- 大型赛事活动安保服务方案投标文件(技术标)
评论
0/150
提交评论