- 1、本文档共77页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
栈和队列 ——JSOI2010冬令营第4讲 一、栈的概念和特性 回顾线性表的特性: 除了首尾结点,所有的结点都有前驱和后继; 首结点只有后继没有前驱,尾结点只有前驱没有后继; 线性表的任何位置都可以进行插入删除等操作。 现在我们对线性表的操作做一点限制,规定所有的插入或删除操作只能在线性表的一端进行,这样的线性表称为栈(stack)。 栈是一种特殊的线性表,对它的插入和删除都限制在表的同一端进行。 一、栈的概念和特性 把可以操作的一端称为栈顶,不允许操作的一端称为栈底。在栈顶插入一个元素,称为进栈,在栈顶删除一个元素称为出栈。 栈中元素的进出是按后进先出的原则进行,这是栈结构的重要特征。 (LIFO:Last In First Out) 用一个变量记录栈顶的位置,通常称这个变量为栈指针。 练习4.1 设栈S的初始状态为空,现有5个元素组成的序列{1,2,3,4,5},对该序列在S 栈上依次进行如下操作(从序列中的1开始,出栈后不再进栈):进栈,进栈,进栈,出栈,进栈,出栈,进栈,问: 出栈的元素序列是:_________, 栈顶指针的值为______, 栈顶元素为:______________。 练习4.2 设栈S初始状态为空,元素e 1 ,e 2 ,e 3 ,e 4 ,e 5 ,e 6依次通过栈S,若出栈后的输出顺序为e 2 ,e 4 ,e 3 ,e 6 ,e 5 ,e 1 ,则栈S的容量至少应该为( )。 A)2 B)3 C)4 D)5 练习4.3 若已知一个栈的入栈顺序是1,2,3,……,n,其输出序列为P1,P2,P3,……,Pn,若P1是n,则Pi是( )。 A)i B)n-1 C)n-i+1 D)不确定 二、栈的存储结构 顺序栈 type arraytype= array[1.. n] of datatype; var stack:arraytype; top:integer; 使用一维数组stack作为栈的存储结构 n是栈的容量,即栈中最多可存放的元素 top是栈指针,top=0,表示栈空,top=n,表示栈满;topn或者top0,则栈溢出 三、栈的主要运算 ⑴在使用栈之前,首先需要将栈初始化; ⑵往栈顶加入一个新元素,称进栈(压栈); ⑶删除栈顶元素,称出栈(退栈、弹出); (4)在使用栈的过程中,还要不断测试栈是否为空或已满,称为测试栈。 三、栈的主要运算 (1)栈的初始化操作(栈置空) top:=0 (2)判断栈空函数 function sempty(stack:arraytype):boolean; begin sempty:=(top=0); end; (3)判断栈满函数 function sfull(stack:arraytype):boolean; begin sfull:=(top=n); end; 三、栈的主要运算 (4)进栈的操作过程(压栈push) procedure push(x:integer); begin if sfull(stack) then writeln(‘Stack full!’) else begin top:=top+1; stack[top]:= x end end; 三、栈的主要运算 (6)出栈操作过程(pop) function pop:integer; begin if sempty(stack) then begin writeln(‘Stack empty!’); end else begin pop:=stack[top]; top:=top-1 end end; 四、栈的应用 1、简单应用:将十进制数N转换成r进制的数。 其转换方法利用辗转相除法: 以M=3456,r=8为例转换方法如下: M M / 8(整除) M % 8(求余) 3467 433 3 低 433 54 1 54 6
文档评论(0)