栈的定义和存储方式

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
提示算法:设两个栈,一个是操作数栈,用来存放操作数,如3、4、 8等,另一个是运算符栈,用来存放运算符。 首先将标志“#”进运算符栈的栈底。 然后依次扫描,按照栈的后进先出原则进行: (1)遇到操作数,进操作数栈; (2)遇到运算符时,则需将此运算符的优先级与栈顶运算符的 优先级比较, 若若高于栈顶元素则进栈,继续扫描下一符号, 否则,将运算符栈的栈顶元素退栈,形成一个操作码Q,同时操 作数栈的栈顶元素两次退栈,形成两个操作数a、b,让计算机对操作 数与操作码完成一次运算操作,即aQb,并将其运算结果存放在操作 数栈中…… 模拟计算机处理算术表达式过程。从键盘上输入算术表达式串(只含 +、-、×、÷运算符,充许含括号),输出算术表达式的值。设输 入的表达式串是合法的。 附源程序:
(2) 重点掌握在顺序栈上和链栈上实现栈的基本 运算算法,注意栈满和栈空的条件。
例题讲解
1.表达式的求值 问题:能否设计算法,编制一个程序,让计 算机扫描如下表达式,并将其值打印出来。 # 3 * ( 4 + 8 ) / 2 -5 # 注:给表达式设置#,标志扫描的开始和结 束。
问题的分析
顺序栈进栈和出栈示意图
利用上述结构,我们可以形式地定义栈类型 TStack如下: Type TStack=Record top:integer; element:array[1..maxlength] of TElement; End;
3.1.3 栈的链式存储结构及其基本运 算的实现
采用链式存储的栈称为链栈,这里采用单链表实现。
链栈的优点是不存在栈满上溢的情况。我们规定
栈的所有操作都是在单链表的表头进行的,下图是头 结点为*lhead的链栈,第一个数据结点是栈顶结点,最 后一个结点是栈底结点。栈中元素自栈顶到栈底依次
是a1、a2、…、an。
链栈示意图
小结
(1) 理解栈的特性。
栈的几种基本运算如下:
(1)销毁栈ClearStack(&s):释放栈s占用的存储空间。 (2)求栈的长度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。
例3.4 设n个元素进栈序列是 1,2,3,…,n,其输出 序列是p1,p2,…,pn,若p1=3,则p2的值 。
(A) 一定是2
(C) 不可能是1
(B) 一定是1
(D) 以上都不对
答:当 p1=3时 ,说明1,2,3先进栈,立即出栈3,然后 可能出栈 , 即为 2, 也可能 4 或后面的元素进栈 , 再出 栈。因此,p2可能是 2,也可能是 4,…,n,但一定不能 是1。所以本题答案为C。
3.1.1 栈的定义
栈是一种只能在一端进行插入或删除操作的线性 表。表中允许进行插入、删除操作的一端称为栈 顶。 栈顶的当前位置是动态的 ,栈顶的当前位置由一 个称为栈顶指针的位置指示器指示。表的另一端 称为栈底。 当栈中没有数据元素时,称为空栈。 栈的插入操作通常称为进栈或入栈 ,栈的删除操 作通常称为退栈或出栈。
例 3.2 设一个栈的输入序列为 A,B,C,D, 则借助 一个栈所得到的输出序列不可能是 。 (A) A,B,C,D (C) A,C,D,B (B) D,C,B,A (D) D,A,B,C
答:可以简单地推算,得容易得出D,A,B,C是 不可能的,因为D先出来,说明A,B,C,D均在栈中, 按照入栈顺序,在栈中顺序应为D,C,B,A,出栈 的顺序只能是D,C,B,A。所以本题答案为D。
例 3.3 已知一个栈的进栈序列是 1,2,3,…,n, 其输 出序列是p1,p2,…,pn,若p1=n,则pi的值 。
(A) i (C) n-i+1 p2=n-1, p3=n-2, …, pn=1 推断出pi=n-i+1,所以本题答案为C。 ຫໍສະໝຸດ BaiduB) n-i (D) 不确定
答:当p1=n时,输出序列必是n,n-1,…,3,2,1,则有:
program exsj_1; const max=100; var number:array[0..max] of integer; symbol:array[1..max] of char; s,t:string; i,p,j,code:integer; procedure push;{算符入栈运算} begin inc(p);symbol[p]:=s[i]; end;
进栈
出栈
栈顶
栈底
栈示意图
栈又称为后进先出(Last In First Out)表,简称为LIFO表。所以, 只要问题满足LIFO原则,就可以使用栈。
例3.1 设有4个元素a、b、c、d进栈,给出它 们所有可能的出栈次序。 答:所有可能的出栈次序如下: abcd adcb bcda cdba abdc bacd bdca dcba acbd badc cbad acdb bcad cbda
数据结构
数据结构 栈的定义; 栈的顺序存储方式; 栈的链式存储方式
授课内容
•栈的定义 •栈的顺序存储方式 •栈的链式存储方式
教学目标
•熟练掌握栈的定义 •熟练掌握栈的顺序存储结构及其基本 运算实现 •熟练掌握栈的链式存储结构及其基本 运算的实现
教学重点
•栈的定义
教学难点
•栈的顺序存储结构及其基本运算实现 •栈的链式存储结构及其基本运算的实 现
(8) 显示栈中元素DispStack(s):从栈顶到栈底顺序显示栈中所有元素。
3.1.2 栈的顺序存储结构及其基本 运算实现
栈的存储与实现 栈的数组实现:由于栈是一个特殊的表,我们可以用数组来 实现栈。考虑到栈运算的特殊性,我们用一个数组 elements[1..maxlength]来表示一个栈时,将栈底固定在数 组的底部,即elements[1]为最早入栈的元素,并让栈向数 组上方(下标增大的方向)扩展。同时,我们用一个游标top来 指示当前栈顶元素所在的单元。当top=0时,表示这个栈为 一个空栈。在一般情况下,elements中的元素序列 elements[top],elements[top-1],..,elements[1]就构成了一 个栈。这种结构如图2所示。
相关文档
最新文档