版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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、堆栈的定义栈的定义:栈是插入和删除只能在其一端进行的线性表,并按后进先出的原则进行操作。栈顶:进行插入、删除的一端;栈底:另一端;空栈:表中没有元素时。a5a3a2a1 a4进栈出栈栈顶栈底例 线性表 (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-1top1230-1top1230ACBtop1230ABtop1230Atop1230-1栈内变化情况顺序栈AStack的类定义template class AStack private: int size ;/ 数组的规模 T * stackArray ; / 存放堆栈元素的数组 int top ; / 栈顶所在数组元素的下标public: AStack ( int MaxStackSize ) / 构造函数 size = MaxStackSize ; stac
4、kArray = new T MaxStackSize ; top = -1 ; AStack ( ) delete stackArray ; / 析构函数bool Push ( const T& item ) ; / 向栈顶压入一个元素bool Pop ( T & item ) ; / 从栈顶弹出一个元素bool Peek ( T & item ) const ; / 存取栈顶元素int IsEmpty ( void ) const return top = = -1 ; / 检测栈是否为空int IsFull ( void ) const return top size-1 ; / 检测栈
5、是否为满void clear ( void ) top-1 ; / 清空栈 ;算法 Push (A, item) / 向顺序栈A中压入一个元素itemP1. 栈满? IF topsize-1 THEN (PRINT“栈满无法压入”. RETURN.)P2. 入栈 toptop1. / 更新栈顶元素的下标 Atopitem. / 压入新栈顶元素 top1230-1top1230ABtop1230A堆栈变化情况top1230ACB算法 Pop (A. item) / 从顺序栈A中弹出栈顶元素,并存放在变量item中P1. 栈空? IF top -1 THEN (PRINT“栈空无法弹出”. RET
6、URN.)P2. 出栈 itemAtop. / 保存栈顶元素值 toptop-1. / 更新栈顶元素的下标 top1230ACBtop1230ABtop1230-1top1230A堆栈变化情况算法 Peek (A, item) / 将顺序栈A的栈顶元素存放在变量item中P1. 栈空?IF top -1 THEN (PRINT“栈空”. RETURN.)P2. 读取栈顶元素 itemAtop. / 保存栈顶元素值 与pop的区别是什么?top top-12.5 堆 栈2.5.1 堆栈的定义和主要操作2.5.2 顺序栈2.5.3 链式栈2.5.4 顺序栈与链式栈的比较2.5.5 堆栈的应用2.5
7、.3 堆栈的链式存储用单链表实现堆栈要为每个栈元素分配一个额外的指针空间。首先考虑栈顶对应链表的表头还是表尾。因为堆栈主要操作(插入、删除、存取)的对象是栈顶元素,若栈顶对应表尾,则每次操作的时间复杂性为O(n) ;若栈顶对应表头,则每个操作的时间复杂性是O(1),显然,栈顶对应表头是合理的。另外,链式栈中不需要哨位结点。 链式栈LStack的类定义template class LStackprivate : SLNode * top ;/ 栈顶指针指向表头public : LStack ( ) top = NULL ; / 构造函数 LStack ( ) clear ( ) ; / 析构函数
8、void clear ( ) ; / 清空栈bool Push ( const T& item ) ; / 向栈顶压入一个元素bool Pop ( T & item ) ; / 从栈顶弹出一个元素bool Peek ( T & item ) const ; / 读取栈顶元素int IsEmpty ( void ) const return top = = NULL ; / 检测栈是否为空 ;算法 Push (item) / 向栈顶指针为top的链式栈中压入一个元素item P1. 创建新结点 sAVAIL. /为新结点申请空间 data(s) item. next(s) top. / 新结点的
9、数据域存放item,指针域存放原栈顶结点的地址信息P2. 更新栈顶指针 tops. / 更新栈顶指针,令其指向新入栈结点算法 Pop ( item) / 从栈顶指针为top的链式栈中弹出栈顶元素,并存放在变量item中P1. 栈空? IF top= NULL THEN (PRINT“栈空无法弹出”. RETURN.)P2. 出栈 itemdata(top). / 保存栈顶结点的字段值 qnext(top). / 令指针q指向次栈顶结点 AVAILtop. / 释放栈顶结点的空间 topq./ 更新栈顶指针,令其指向q所指结点 算法 Peek ( item) / 将栈顶指针为top的链式栈的栈顶
10、元素存放在变量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 顺序栈与链式栈的比较2.5.5 堆栈的应用顺序栈与链式栈的比较在空间复杂性上,顺序栈必须初始就申请固定的空间,当栈不满时,必然造成空间的浪费;链式栈所需空间是根据需要随时申请的,其代价是为每个元素提供空间以存储其next指针域。在时间复杂性上,对于针对栈顶的基本操作(压入、弹出和栈顶元素存取),顺序栈和
11、链式栈的时间复杂性均为O(1) . 2.5 堆 栈2.5.1 堆栈的定义和主要操作2.5.2 顺序栈2.5.3 链式栈2.5.4 顺序栈与链式栈的比较2.5.5 堆栈的应用堆栈的应用括号匹配 高级语言程序设计中的各种括号应该匹配,例如:“(” 与 “)”匹配、“”与 “” 匹配、“”与 “” 匹配等。字符串a=(b*c+free( ) 中的括号就没有匹配上,因为串中第一个关括号 “” 和最近的未匹配开括号 “(” 不匹配。第二章 线性表、堆栈和队列 2.1 线性表的定义和基本操作2.2 线性表的顺序存储结构2.3 线性表的链接存储结构2.4 复杂性分析2.5 堆栈2.6 队列2.6 队列2.6
12、.1 队列的定义和主要操作2.6.2 顺序队列2.6.3 链式队列1、队列的定义队列的定义:队列是插入在一端进行而删除在其另一端进行的线性表。按先进先出的原则进行操作。能进行删除的一端称为队首(front);能进行插入的一端称为队尾(rear);没有元素的队列称为空队列。a1a2a3a4a5队尾队首入队出队队列的先进先出性:可以对输入序列起缓冲作用;凡符合先进先出性,都可应用队列,如操作系统中作业调度、图的广度优先搜索等问题。队列的封闭性:和栈类似,队列的封闭性也非常好,使用起来非常安全。2、队列的基本操作: (1)队列初始化(2)入队 (插入)(3)出队(删除)(4)读取队首元素(5)判断队
13、列是否空 (6)确定队列中元素个数 (7)置空队列 2.6 队列2.6.1 队列的定义和主要操作2.6.2 顺序队列2.6.3 链式队列队列的顺序存储 存放队列元素的数组: T qlistMaxQSize front 队首元素的数组下标 rear (要入队元素的下标) 队尾元素的下标加1 a1a2a3frontrear 例 等待处理某作业进队、出队情况。 front=0rear=1a0012Maxsize-1a0进队012Maxsize-1front=0rear=0初始状态 插入: rear=rear+1 front=0a0a1a2012Maxsize-1a1 a2进队rear=3front=
14、1a1a2012Maxsize-1a0出队rear=3 删除队首元素的方法1:令front=front+1 front=3012Maxsize-1a1 a2出队rear=3 012Maxsize-1rear=nfront=n-3an-3an-2 无法利用的空间x 删除队首元素方法2 :元素向前移动,front总等于0 插入: rear=rear+1a2012Maxsize-1a0出队front=0 rear=2a1front=0an-3an-2012Maxsize-1rear=3x front= n-3an-3an-2012Maxsize-1rear=n-1 循环队列:很好的解决了存在的问题。
15、n-3rear= n-1an-3an-20.1.front=n-3n-2 插入元素 x:front=n-3an-3an-2012Maxsize-1rear=0 xn-3an-3rear=0an-20.1n-1.front=n-3n-2xrear顺时针移动一位rear = (rear+1) MOD MaxQSize删除队首元素: front顺时针移动一位front = (front+1) MOD MaxQSize;rear0front=9.1.CD删除Crearfront=00.1.D 采用环状模型来实现队列,各数据成员的意义如下: front指定队首位置,删除一个元素就将front顺 时针移动
16、一位;rear指向元素要插入的位置,插入一个元素就将rear顺时针移动一位;count存放队列中元素的个数,当count等于MaxQSize时,不可再向队列中插入元素。 队空:count=0 队满:count=MaxQSize顺序队列类AQueue的类声明template class AQueueprivate: int front ;/ 队首所在数组元素下标 int rear ; / 新元素要插入的位置(下标) int count ; / 队列中元素个数 T *QArray ; / 存放队列元素的数组 int Size ;/ 存放队列的数组规模public: AQueue ( int Max
17、QueueSize = 10 ) / 构造函数 AQueue ( void ) delete QArray ; / 析构函数bool QInsert ( const T& item )/ 向队尾插入元素itembool QDelete ( T & item ) ;/ 删除队首元素并将该元素值保存至itemvoid QClear ( void ) front = rear = count = 0 ; / 清空队列T QFront ( void ) const ; / 存取队首元素值bool isEmpty ( void ) const return count = = 0 ; / 检测队列是否为
18、空bool isFull ( void ) const return count = = Size ; / 检测队列是否为满 ;算法QInsert (A, item) / 在队列A中将元素item插入队尾QI1. 队列满?IF countsize THEN (PRINT“队列已满无法插入”. RETURN. )QI2. 插入 Arear item. / 将新元素插入队尾QI3. 更新 rearMOD(rear1, size). / 更新队尾下标 countcount1. / 更新队列长度 算法QDelete (A. item) / 删除队列A的队首元素,并将其元素值赋给变量itemQD1. 队
19、列空? IF count0 THEN (PRINT “队列空无法删除”. RETURN. )QD2. 出队 item Afront. / 将队首元素保存至itemQD3. 更新 frontMOD(front1, size). / 更新队首元素下标 countcount-1. / 更新队列长度 算法QFront (A, item) / 读取队列A的队首元素值,并将其赋给变量itemQF1. 队列空? IF count0 THEN (PRINT “队列空无法读取”. RETURN. )QF2. 存取 item Afront. / 将队首元素保存至item FR0123456aFR0123456(a
20、) 创建一个队列(b) 插入元素 a队列运行示意图47abcFR0123456FR0123456(c) 插入元素b、c(d) 取出元素 a、b、c48hidefgRF0123456hijdefgFR0123456(e) 插入元素d、e、f、g、h、i(f) 插入元素 j49FR0123456(g) 删除所有元素502.6 队列2.6.1 队列的定义和主要操作2.6.2 顺序队列2.6.3 链式队列队列的链接存储链式队列的结构:(a1, a2, , an) ana1a2frontrear链式队列LQueue的类声明template class LQueue private:SLNode * fr
21、ont, * rear ; / 指向队首和队尾的指针public:LQueue ( void ) front = rear = NULL; / 构造函数 LQueue ( void ) QClear ( ) ; / 析构函数 void QInsert ( const T& item ) ;/ 队尾添加元素bool QDelete ( T& item ) ;/ 删除队首元素bool QFront ( T& item ) const ;/ 存取队首元素值/ 检测队列状态int IsEmpty ( void ) const return front = = NULL ; void QClear ( void ) ; / 清空队列 ;算法QInsert (item) / 将元素item插入队尾QI1. 创建新结点 s AVAIL. data(s)item. next(s)NULL. / 为新结点申请空间,令其字段值为item,指针域为空QI2. 队空? IF frontNULL THEN fronts. /若队列为空,令队首指针指向s ELSE ne
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 疫情防控背景下学生心理辅导策略研究
- 银行对公客户业务场景化解决方案研究
- 智能分析学生体能测试数据的科技应用探讨
- 绿色校园的创建与学校环境教育的关系研究
- 语文教材分析与教师专业素养培育
- 2025年福建信息职业技术学院高职单招职业技能测试近5年常考版参考题库含答案解析
- 2025年漯河职业技术学院高职单招职业技能测试近5年常考版参考题库含答案解析
- 绿色健康宠物饲料的发展及挑战
- 心理教育与健康生活课程设计策略与实践
- 2025年普通机箱项目可行性研究报告
- 医院培训课件:《如何撰写护理科研标书》
- 河南省郑州市2023-2024学年高二上学期期末考试 数学 含答案
- 2024年山东省济南市中考英语试题卷(含答案)
- 2024年北师大版八年级上册全册数学单元测试题含答案
- 江苏省南京市第二十九中2025届数学高二上期末学业质量监测模拟试题含解析
- 八年级下学期期末考试语文试题(PDF版含答案)
- 浙教版八年级下册科学第一章 电和磁整章思维导图
- (正式版)SH∕T 3541-2024 石油化工泵组施工及验收规范
- 动物疫病传染病防控培训制度
- 美团代运营合同模板
- 初中英语七选五经典5篇(附带答案)
评论
0/150
提交评论