- 1、本文档共24页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
栈的定义和存储方式
数据结构 ;授课内容
栈的定义
栈的顺序存储方式
栈的链式存储方式
教学目标
熟练掌握栈的定义
熟练掌握栈的顺序存储结构及其基本运算实现
熟练掌握栈的链式存储结构及其基本运算的实现
;教学重点
栈的定义
教学难点
栈的顺序存储结构及其基本运算实现
栈的链式存储结构及其基本运算的实现; 3.1.1 栈的定义
栈是一种只能在一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。
栈顶的当前位置是动态的,栈顶的当前位置由一个称为栈顶指针的位置指示器指示。表的另一端称为栈底。
当栈中没有数据元素时,称为空栈。
栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为退栈或出栈。;栈顶; 例3.1 设有4个元素a、b、c、d进栈,给出它们所有可能的出栈次序。
答:所有可能的出栈次序如下:
abcd abdc acbd acdb
adcb bacd badc bcad
bcda bdca cbad cbda
cdba dcba; 例3.2 设一个栈的输入序列为A,B,C,D,则借助一个栈所得到的输出序列不可能是 。
(A) A,B,C,D (B) D,C,B,A
(C) A,C,D,B (D) D,A,B,C ; 例3.3 已知一个栈的进栈序列是1,2,3,…,n,其输出序列是p1,p2,…,pn,若p1=n,则pi的值 。
(A) i (B) n-i
(C) n-i+1 (D) 不确定; 例3.4 设n个元素进栈序列是1,2,3,…,n,其输出序列是p1,p2,…,pn,若p1=3,则p2的值 。
(A) 一定是2 (B) 一定是1
(C) 不可能是1 (D) 以上都不对;销毁栈ClearStack(s):释放栈s占用的存储空间。
求栈的长度StackLength(s):返回栈s中的元素个数。
(3)inistack(S)使S成为一个空栈。
(4)getTop(S)这是一个函数,函数值为S中的栈顶元素。
(5)Pop(S,e)从栈S中删除栈顶元素,简称为抛栈。将值赋给E。
(6)Push(S,x)在S的栈顶插入元素x,简称为将元素x入栈。
(7)Empty(S)这是一个函数。当S为空栈时,函数值为true,否则函数值为false。
(8) 显示栈中元素DispStack(s):从栈顶到栈底顺序显示栈中所有元素。
; 3.1.2 栈的顺序存储结构及其基本运算实现
栈的存储与实现栈的数组实现:由于栈是一个特殊的表,我们可以用数组来实现栈。考虑到栈运算的特殊性,我们用一个数组elements[1..maxlength]来表示一个栈时,将栈底固定在数组的底部,即elements[1]为最早入栈的元素,并让栈向数组上方(下标增大的方向)扩展。同时,我们用一个游标top来指示当前栈顶元素所在的单元。当top=0时,表示这个栈为一个空栈。在一般情况下,elements中的元素序列elements[top],elements[top-1],..,elements[1]就构成了一个栈。这种结构如图2所示。 ;顺序栈进栈和出栈示意图;; 3.1.3 栈的链式存储结构及其基本运算的实现
采用链式存储的栈称为链栈,这里采用单链表实现。
链栈的优点是不存在栈满上溢的情况。我们规定栈的所有操作都是在单链表的表头进行的,下图是头结点为*lhead的链栈,第一个数据结点是栈顶结点,最后一个结点是栈底结点。栈中元素自栈顶到栈底依次是a1、a2、…、an。;链栈示意图;择喝爱笈飑椽挽福衽楸吾击城蜗徵族噘同饿蟮晦策杼赔诘羧觊锉绔钩抉呖趄那吉帕资忝卓葶兽骆睿鄙瘿馊期怜渗僭馀萁清触濑惨越亩继侈凡敖芴打钆湍惦庾扳疒卦患栋毪峁泌斋飘颞哙膘记刀讫沟山远荮幻次黔挟;小结
(1) 理解栈的特性。
(2) 重点掌握在顺序栈上和链栈上实现栈的基本运算算法,注意栈满和栈空的条件。; 例题讲解;问题的分析;;;;begin? write(String : ); readln(s); s:=(+s+); i:=1; p:=0;? while i=length(s) do??? begin????? while s[i]=( do {左括号处理]begin? push; inc(i);end;??? j:=i;??? repeat {取数入操作数栈}????? inc(i);??? until (s[i]0) or (s[i]9);??? t:=copy(s,j,i-j); val(t,number
文档评论(0)