数据结构课程内容_第1页
数据结构课程内容_第2页
数据结构课程内容_第3页
数据结构课程内容_第4页
数据结构课程内容_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1数据结构课程的内容2讨论: 已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,请写出在P结点后插入S结点的核心语句序列。答:此题答案不唯一。法二:已知P结点,则不必“顺藤摸瓜”,直接链接即可。(4)S-next=P-next;(1) P-next=S;法一:从头“摸”起:(7) Q=P;(11) P=L;(8) while(P-next!=Q)P=P-next;(10) P=Q;(4) S-next=P-next;(1) P-next=S;33.1 栈(Stack) 第三章 栈和队列3.2 队列(Queue)1. 定义2. 逻辑结构3. 存储结构4. 运算规则5. 实现方式

2、1. 定义2. 逻辑结构3. 存储结构4. 运算规则5. 实现方式41. 定义3.1 栈与同线性表相同,仍为一对一关系。用顺序栈或链栈存储均可,但以顺序栈更常见只能在栈顶运算,且访问结点时依照后进先出(LIFO)或先进后出(FILO)的原则。关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同。基本操作有入栈、出栈、读栈顶元素值、建栈、或判断栈满、栈空等。3. 存储结构4. 运算规则5. 实现方式 2. 逻辑结构限定只能在表的一端进行插入和删除运算的线性表(只能在栈顶操作)5问:堆栈是什么?它与一般线性表有什么不同?3.1 栈答:堆栈是一种特殊的线性表,它只能在表的一端(即栈顶)进行插

3、入和删除运算。 与一般线性表的区别:仅在于运算规则不同。一般线性表 堆栈逻辑结构:一对一 逻辑结构:一对一存储结构:顺序表、链表 存储结构:顺序栈、链栈运算规则:随机存取 运算规则:后进先出(LIFO)“进” 压入=PUSH(x)“出” 弹出=POP ( y )6栈 是仅在表尾进行插入、删除操作的线性表。表尾(即 an 端)称为栈顶 top ; 表头(即 a1 端)称为栈底base例如: 栈 s= (a1 , a2 , a3 , .,an-1 , an ) a1 称为 栈底元素 an 称为 栈顶元素插入元素到栈顶(即表尾)的操作,称为入栈。从栈顶(即表尾)删除最后一个元素的操作,称为出栈。教材

4、P44对栈有更详细定义:强调:插入和删除都只能在表的一端(栈顶)进行!7顺序栈示意图s a1 a2 a3data a4(栈底)(栈顶)99.3210top8 a1 a2 an顺序栈S ai表和栈的操作区别对线性表 s= (a1 , a2 , . , an-1 , an )表头表尾栈底base栈顶top低地址高地址写入:vi= ai读出: x= vi压入:PUSH (an+1)弹出: POP (x)前提:一定要预设栈顶指针top!低地址高地址vi a1 a2 ai an 顺序表Vn an+19入栈操作例如用堆栈存放(A,B,C,D) (注意要遵循“后进先出” 原则)AACBABAtop核心语句:

5、top=L; 顺序栈中的PUSH函数status Push(ElemType x) if(topM)上溢 else vtop+=x;Push (B);Push (C);Push (D);toptoptoptop低地址LPush (A);高地址MBCD10 出栈操作例如从栈中取出B (注意要遵循“后进先出” 原则)DCBAtoptopDCABDCBAtopDCBAtop低地址L高地址MD核心语句:Pop ( );Pop ( );Printf( Pop () );顺序栈中的POP函数status Pop( ) if(top=L) 下溢 else y=v-top; return(y); 11例1:一

6、个栈的输入序列是12345,若在入栈的过程中允许出栈,则栈的输出序列43512可能实现吗?12345的输出呢? 43512不可能实现,主要是其中的12顺序不能实现; 12345的输出可以实现,只需压入一个立即弹出一个即可。 435612中到了12顺序不能实现; 135426可以实现。例2:如果一个栈的输入序列为123456,能否得到435612和135426的出栈序列?答:答:12例3(严题集)一个栈的输入序列为123,若在入栈的过程中允许出栈,则可能得到的出栈序列是什么?答:可以通过穷举所有可能性来求解: 1入1出, 2入2出,3入3出, 即123; 1入1出, 2、3入3、2出, 即132

7、; 1、2入,2出, 3入3出, 即231; 1、2入,2、1出,3入3出, 即213; 1、2、3入,3、2、1出, 即321;合计有5种可能性。13例4:计算机系2001年考研题(程序设计基础)设依次进入一个栈的元素序列为c,a,b,d,则可得到出栈的元素序列是: )a,b,c,d )c,d,a,b )b,c,d,a )a,c,d,bA、D可以( B、C不行)。讨论:有无通用的判别原则?有。在可能的输出序列中,不存在这样的输入序列i,j,k,能同时满足 ijk 和 PjPkdata=x; p-link=st; st=p; Status pop( ) if(st=NULL)下溢elsey=s

8、t-data;p=st;st=st-link; free(p); return(y); 链栈入栈函数链栈出栈函数插入表头从表头删除18 链栈不必设头结点,因为栈顶(表头)操作频繁;采用链栈存储方式,可使多个栈共享空间;当栈中元素个数变化较大,且存在多个栈的情况下,链栈是栈的首选存储方式。说 明19问:为什么要设计堆栈?它有什么独特用途?调用函数或子程序非它莫属;递归运算的有力工具;用于保护现场和恢复现场;简化了程序设计的问题。答:20 数制转换(十转N) P48 设计思路:用栈暂存低位值例2:括号匹配的检验P49 设计思路:用栈暂存左括号例3 :表达式求值 -P52 设计思路:用栈暂存运算符例

9、4:汉诺仪(Hanoi)塔-P55 设计思路:用栈实现递归调用例1:21例3 表达式求值 ( 这是栈应用的典型例子 ) 这里,表达式求值的算法是 “算符优先法”。例如:3*(7 2 ) (1)要正确求值,首先了解算术四则运算的规则: a. 从左算到右 b. 先乘除,后加减 c. 先括号内,后括号外 由此,此表达式的计算顺序为: 3*(7 2 )= 3 * 5 = 1522(2)根据上述三条运算规则,在运算的每一步中,对任意相继出现的算符1和2 ,都要比较优先权关系。算符优先法所依据的算符间的优先关系见教材P53表 (是提供给计算机用的表!)由表可看出,右括号 ) 和井号 # 作为2时级别最低;

10、 由c 规则得出: * ,/, + ,-为1时的优先权低于(,高于) 由a规则得出:(=) 表明括号内运算,已算完。 # = # 表明表达式求值完毕。栈的应用(表达式求值)23(3)算法思想:设定两栈:操作符栈 OPTR ,操作数栈 OPND栈初始化:设操作数栈 OPND 为空;操作符栈 OPTR 的栈底元素为表达式起始符 #;依次读入字符:是操作数则入OPND栈,是操作符则要判断: if 操作符 栈顶元素,压入OPTR栈。栈的应用(表达式求值)24栈的应用(表达式求值)OPTROPNDINPUTOPERATE3*(7-2)#Push(opnd,3) #*(7-2)#3#Push(optr,*

11、)#,*3(7-2)#Push(optr,()#,*,(37-2)#Push(opnd,7)#,*,(3,7-2)#Push(optr,-)#,*,(,3,72)#Push(opnd,2)#,*,(,3,7,2)#Operate(7-2)#,*,(3,5)#Pop(optr)#,*3,5#Operate(3*5)#15#GetTop(opnd)25Status EvaluateExpression( OperandType &result) InitStack(OPND); InitStack(OPTR);Push(OPTR ,#);c=getchar(); while(c!=#)&(GetT

12、op(OPTR)!=#) if (!In(c,OP) Push(OPND,c); c=getchar(); else switch(compare(c,GetTop(OPTR) case : Push(OPTR , c); c=getchar();break; case =: Pop(OPTR);c=getchar();break; case 1 时, 则设法将 前 n 1 个盘子 借助 z ,从 x 移到 y 柱上,把 盘子 n 从 x 移到 z 柱上; 把n 1 个盘子 从 y 移到 z 柱上。x y znn 127Void Hanoi ( int n, char x, char y, c

13、har z ) /将 n 个 编号从上到下为 1n 的盘子从 x 柱,借助 y 柱移到 z 柱 if ( n = = 1 ) move ( x , 1 , z ) ; /将编号为 1 的盘子从 x 柱移到 z 柱 else /将 n -1个 编号从上到下为1n-1的盘子从 x 柱,借助 y 柱移到 z 柱 Hanoi ( n-1 , x , z , y ) ; move ( x , n, z) ; /将编号为 n 的盘子从 x 柱移到 z 柱 /将 n -1个 编号从上到下为 1n-1的盘子从 y 柱,借助 x 柱移到 z 柱 Hanoi ( n-1 , y , x , z ); /Hanoi

14、28 定 义3.2 队列与同线性表相同,仍为一对一关系。顺序队或链队,以循环顺序队更常见。只能在队首和队尾运算,且访问结点时依照先进先出(FIFO)的原则。关键是掌握入队和出队操作,具体实现依顺序队或链队的不同而不同。基本操作有入队或出队,建空队列,判队空或队满等操作。3. 存储结构4. 运算规则5. 实现方式 2. 逻辑结构只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表 (头删尾插)29队列 (Queue)是仅在表尾进行插入操作,在表头进行删除操作的线性表。 表尾即 an 端,称为 队尾 ; 表头即 a1 端,称为队头。 它是一种先进先出()的线性表。例如:队列 Q= (a1

15、, a2 , a3 , .,an-1 , an )插入元素称为入队;删除元素称为出队。队头队尾教材P59对队列有更详细定义:队列的抽象数据类型定义见教材5960队列的存储结构为链队或顺序队 (常用循环顺序队)30链队列示意图讨论:空队列的特征?Q(队尾)(队首)fronta1a2a3rearpfrontrear 怎样实现入队和出队操作?入队(尾部插入):rear-next=S; rear=S;出队(头部删除):front-next=p-next;完整动作设计参见教材P61-62 队列会满吗?front=rear一般不会,因为删除时有free动作。除非内存不足!31顺序队示意图Q(队尾)(队首)

16、front a1 a2 a3data a40.99rear 队列会满吗?很可能会,因为数组前端空间无法释放。因此数组应当有长度限制。 空队列的特征? 约定:front=rear队尾后地址入队(尾部插入):vrear=e; rear+;出队(头部删除):x=vfront; front+;讨论:假溢出 有缺陷 怎样实现入队和出队操作?3.2 队列32问:什么叫“假溢出” ?如何解决?答:在顺序队中,当尾指针已经到了数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫“假溢出”。3.2 队列解决假溢出的途径采用循环队列33a3a2a10123N-1rearfront循环队列(臆造)顺序队列a

17、3a2a1frontrear 0 1 2 3 . .N-1新问题:在循环队列中,空队特征是front=rear;队满时也会有front=rear;判决条件将出现二义性!解决方案有三: 加设标志位,让删除动作使其为1,插入动作使其为0,则可识别当前 front=rear 使用一个计数器记录队列中元素个数(即队列长度); 人为浪费一个单元,令队满特征为front=(rear+1)%N;34队空条件 : front = rear (初始化时:front = rear )队满条件: front = (rear+1) % N (N=maxsize)队列长度:L=(Nrearfront)% N J2 J3

18、J1 J4 J5frontrear 选用空闲单元法:即front和rear之一指向实元素,另一指向空闲元素。 问2: 在具有n个单元的循环队列中,队满时共有多少个元素? n-1个6 问1:左图中队列长度L=?35J6 J5J7J8 J9例1: 一循环队列如下图所示,若先删除4个元素,接着再插入4个元素,请问队头和队尾指针分别指向哪个位置? J2 J3J1 J4 J5frontrear解:由图可知,队头和队尾指针的初态分别为front=1和rear=6。frontrear删除4个元素后front=5;再插入4个元素后,r=(6+4)%6=4 frontfrontfrontfrontfront36

19、例2 :数组n用来表示一个循环队列,f 为当前队列头元素的前一位置,r 为队尾元素的位置。假定队列中元素的个数小于n,计算队列中元素的公式为:() rf ()(nfr)% n ()nrf () (nrf)% n4种公式哪种合理?当 r f 时(A)合理;当 r f 时(C)合理;分析 :综合2种情况,以(D)的表达最为合理例3:在一个循环队列中,若约定队首指针指向队首元素的前一个位置。那么,从循环队列中删除一个元素时,其操作是 先 ,后 。 移动队首指针取出元素37问:为什么要设计队列?它有什么独特用途?离散事件的模拟(模拟事件发生的先后顺序);操作系统中多道作业的处理(一个CPU执行多个作业);3. 简化程序设计。答:循环队列的操作实现见教材P6438循环队列的操作实现1)初始化一空队列算法要求:生成一空队列算法操作:为队列分配基本容量空间 设置队列为空队列,即 front=rear=0(也可为任意单元,如 2,或 4);39算法:Status InitQueue ( SqQueue &q )/初始化空循环队列 q q . base=(QElemType *)malloc(sizeof(QElemType)* QUEUE_MAXSIZE); /分配空间 if (!q.base) exit(OVERFLOW);/失败,退

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论