第三章 栈和队列(精品).ppt
《第三章 栈和队列(精品).ppt》由会员分享,可在线阅读,更多相关《第三章 栈和队列(精品).ppt(85页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第三章第三章第三章第三章栈和队列栈和队列栈和队列栈和队列两种特殊的线性表两种特殊的线性表两种特殊的线性表两种特殊的线性表1/26/20231栈和队列栈和队列3.1 栈栈3.2 栈的应用举例栈的应用举例3.3 栈与递归栈与递归3.4 队列队列1/26/202323.1 栈栈 栈栈是仅限定在表的一端操作是仅限定在表的一端操作的线性表。它的插入和删除都只的线性表。它的插入和删除都只能在表的一端进行。能在表的一端进行。定义定义1/26/20233 ADT Stack 数据对象数据对象:D ai|ai ElemSet,i=1,2,.,n,n0 数据关系数据关系:R1|ai-1,aiD,i=2,.,n 约
2、定an 端为栈顶,a1 端为栈底。基本操作:基本操作:ADT Stack3.1.1 栈的类型定义栈的类型定义1/26/20234InitStack(&S)/构造一个空栈构造一个空栈 S基本操作:基本操作:DestroyStack(&S)/销毁栈销毁栈 S GetTop(S,&e)/弹出弹出 S 栈顶元素。栈顶元素。Push(&S,e)/向栈内推入元素向栈内推入元素 e1/26/20235栈的表示和实现栈的表示和实现 顺序存储顺序存储 链表存储链表存储栈的存储方式栈的存储方式栈的性质栈的性质后进先出后进先出1/26/20236栈的顺序存储栈的顺序存储typedef struct char ST1
3、01 int top;stack;stack S;d4c3b2a1栈顶栈顶Top栈底栈底s stop1/26/20237栈的顺序存储栈的顺序存储#define Maxsize 100+1typedef struct elemtype STMaxsize int top;stack;stack S;d4c3b2a1栈顶栈顶top栈底栈底tops s1/26/20238栈的顺序存储栈的顺序存储1.栈空的条件:栈空的条件:S.top=04321栈顶栈顶Top1/26/202392.2.栈的压入操作栈的压入操作Push(&S,e)/栈栈 S 已存在,压入元素已存在,压入元素 e if(s.top=Ma
4、xsize-1)printf(栈满溢出栈满溢出);else S.top+;S.STtop=e;return OK;4321Top1/26/2023102.2.栈的压入操作栈的压入操作Push(&S,e)/栈栈 S 已存在,压入元素已存在,压入元素 e if(s.top=Maxsize-1)printf(栈满溢出栈满溢出);else S.top+;S.STs.top=e;return OK;4321Top23235050Top1/26/2023113.3.栈的弹出操作栈的弹出操作pop(&S,e)/栈栈 S 已存在,压入元素已存在,压入元素 e if(s.top=0)printf(栈栈空下溢空下
5、溢);else e=S.STs.top;S.top-;return OK;432123235050TopTopTop1/26/202312例题例题一个栈的入栈序列是一个栈的入栈序列是12345,则栈的不可能,则栈的不可能的出栈序列是什么?的出栈序列是什么?判断一个顺序栈判断一个顺序栈st(最多元素为最多元素为maxsize)为为栈空栈空he栈满的条件分别是栈满的条件分别是 和和 A)st-top!=0 B)st-top=0 C)st-top!=maxsize-1 D)st-top=maxsize-1 B BD D1/26/202313栈的链式存储栈的链式存储head2118307542561.
6、进栈进栈2.出栈出栈3.读栈顶元素读栈顶元素1/26/2023143.2 栈的应用举例栈的应用举例ClearStack(S)重置重置S为空栈为空栈empty(s)判断栈空判断栈空push(s,ch)将一个元素将一个元素e推入栈推入栈spop(s)将栈顶元素弹出,且返回其元素将栈顶元素弹出,且返回其元素gettop(s,e)取栈顶元素取栈顶元素1/26/202315 例例1 1 行编辑程序问题行编辑程序问题 假设假设“#”为退格符,表示前一个字为退格符,表示前一个字 符无效;符无效;“”为退行符,表示当前行无效;为退行符,表示当前行无效;设立一个设立一个栈栈(输入缓冲区),用以接(输入缓冲区),
7、用以接受用户输入的一行字符,然后逐行存受用户输入的一行字符,然后逐行存入用户数据区。入用户数据区。1/26/202316假设从终端接受了这样两行字符:假设从终端接受了这样两行字符:whli#ilr#e(s#*s)outchaputchar(*s=#+);则实际有效的是下列两行:while(*s)putchar(*s+);1/26/202317假设从终端接受了这样两行字符:假设从终端接受了这样两行字符:whli#ilr#eilhw当当#:Pop(S,e)/弹出当当:ClearStack(S)/清栈否则否则 入栈入栈1/26/202318假设从终端接受了这样两行字符:假设从终端接受了这样两行字符:
8、whli#ilr#eilhw当当#:Pop(S,e)/弹出当当:ClearStack(S)/清栈否则否则 入栈入栈1/26/202319假设从终端接受了这样两行字符:假设从终端接受了这样两行字符:whli#ilr#eilhw当当#:Pop(S,e)/弹出当当:ClearStack(S)/清栈否则否则 入栈入栈1/26/202320 while(ch!=EOF&ch!=n)switch(ch)case#:Pop(S,e);break;case:ClearStack(S);break;/重置S为空栈 default:Push(S,ch);break;ch=getchar();/从终端接收下一个字符
9、 ClearStack(S);/重置S为空栈if(ch!=EOF)ch=getchar();while(ch!=EOF)/EOF为全文结束符将从栈底到栈顶的字符传送至调用过程的数据区;ilhw1/26/202321表达式表达式:=(操作数操作数 1)+(运算符运算符op)+(操作数操作数 2)操作数操作数:=简单变量简单变量|表达式表达式 简单变量简单变量:=标识符标识符|无符号整数无符号整数例例2 2 表达式求值表达式求值-利用算符优先级法则利用算符优先级法则1/26/202322算符间的优先级关系算符间的优先级关系 1 2+*/()#+*/(=)#=1/26/202323例如例如:Exp=
10、a b+(c d/e)f中缀式:#a b+c d/e f#使用两个栈:使用两个栈:栈栈OPTR寄存运算符寄存运算符OP (包括()和#)栈栈OPND寄存操作数寄存操作数 1/26/202324例如例如:#4+2 3 10/5#OPTROPND#4+1/26/202325算符间的优先级关系算符间的优先级关系 1 2+*/()#+*/(=)#=1/26/202326例如例如:#4+2 3 10/5#OPTROPND#4+2+1/26/202327算符间的优先级关系算符间的优先级关系 1 2+*/()#+*/(=)#=1/26/202328例如例如:#4+2 3 10/5#OPTROPND#4+2
11、31/26/202329算符间的优先级关系算符间的优先级关系 1 2+*/()#+*/(=)#=1/26/202330例如例如:#4+2 3 10/5#OPTROPND#4+2 3退栈退栈 322 2 3=63=66进栈进栈10/1/26/2023313.3 栈与递归的实现栈与递归的实现1.求求n!2.Hanoi塔问题塔问题1/26/202332 例例1 求求n!(用递归调用用递归调用)1 n=0fac=n(n-1)!n0int fac(int n)int f;if(n=0)fac=1;else f=fac(n-1)*n;return(f);main()int n=3;p=fac(n);pri
12、ntf(%d,p);1/26/202333 求求n!(用递归调用用递归调用)1 n=0fac=n(n-1)!n0int fac(int n)int f;if(n=0)fac=1;else f=fac(n-1)*n;return(f);main()int n=3;p=fac(n);printf(%d,p);将所有的将所有的实参实参、返回地址返回地址等信息传递给等信息传递给被调用函数被调用函数保存保存;为被调用函数的局部变量为被调用函数的局部变量分配存储区分配存储区;将将控制转移控制转移到被调用函数的入口。到被调用函数的入口。1/26/202334 求求n!(用递归调用用递归调用)1 n=0,1f
13、ac=n(n-1)!n0int fac(int n)int f;if(n=0)fac=1;else f=fac(n-1)*n;return(f);main()int n=3;p=fac(n);printf(%d,p);保存保存被调函数的被调函数的计算结果计算结果;释放释放被调函数的被调函数的数据区数据区;依照被调函数保存的返回地址将依照被调函数保存的返回地址将控制转移控制转移到调用函数。到调用函数。1/26/202335递归的要点:递归的要点:1.由由系统提供一个信息栈,保留函数调用时系统提供一个信息栈,保留函数调用时的相关信息(调用时的信息、返回地址、的相关信息(调用时的信息、返回地址、局部
14、变量);局部变量);2.每执行递归调用语句时,将有关信息送入每执行递归调用语句时,将有关信息送入栈,转入函数入口;栈,转入函数入口;3.每当执行到返回语句时,保存每当执行到返回语句时,保存计算结果计算结果,释放被调函数的数据区,弹出释放被调函数的数据区,弹出返回地址返回地址返返回。回。1/26/202336多个函数嵌套调用的规则是:此时的内存管理实行“栈式管理栈式管理”后调用先返回后调用先返回!例如:void main()void a()void b()a();b();/main /a /bMain的数据区函数a的数据区函数b的数据区 1/26/202337n=3;p=fac(n);print
15、f(p);main()f=fac(n-1)*3;return(f);fac(3)f=fac(n-1)*2;return(f);fac(2)f=fac(n-1)*1;return(f);fac(1)f=1;return(f);fac(0)1/26/202338n=3;p=fac(n);main()f=fac(n-1)*3;fac(3)f=fac(n-1)*2;fac(2)f=fac(n-1)*1;fac(1)f=1;return(f);fac(0)fac(3)fac(2)fac(1)fac(0)RETRETRETRETn 地址地址3 L3 L3 L3 L3 L3 L3 Ln 地址地址3 L13
16、L13 L13 L13 L1n 地址地址2 L22 L22 L2n 地址地址1 L31/26/202339例例2 Hanoi 塔问题塔问题abc1/26/202340例例2 Hanoi 塔问题塔问题abc1/26/202341例例2 Hanoi 塔问题塔问题abc1/26/202342例例2 Hanoi 塔问题塔问题abc1/26/202343void hanoi(int n,char x,char y,char z)/将塔座x上按直径由小到大且至上而下编号为1至n/的n个圆盘按规则搬到塔座z上,y可用作辅助塔座。1 if(n=1)2 move(x,1,z);/将编号为的圆盘从x移到z3 el
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三章 栈和队列精品 第三 队列 精品
限制150内