两种存储结构比较线性表
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
n!=
五、栈的应用
2、计算表达式
(1)由计算规则得算符优先关系表
3+5*3 θ 1:先来的算符 3+5+5 θ 2:后来的算符 * < < > < ) > > > =
θ1 θ2
+ \ (
+ > > > <
> > > <
(2)原理
两工作栈:一个算符栈,一个操作数栈
a.读取到操作数,直接入操作数栈 b.读取到运算符,取运算符栈栈顶元素与该算符比 较优先级: “<”:读取符号入运算符栈;
初始:front=rear=0
队空:front=rear
max-1
…
队满:rear=max
1
0
四、队列的顺序存储结构
假溢出的问题:用循环队列来解决
下一个rear计算公式:rear=(rear+1)mod max
循环队列队空队满标志冲突的问题: 以牺牲一个存储空间为代价,当判断到(下一个 rear==front)时,即认为队满。 实际上,max个空间只存放了(max-1)个元素
结束
四、栈的链式存储结构
data link
设指针域指向次顶结点
规定:top指向栈顶元素地址
基本操作:
判断空栈 进栈
出栈 利用链式存储结构存储栈,可
解决栈的致命错误——上溢
五、栈的应用
1、递归调用
一个子程序调用自身,称为递归调用。
例:阶乘的计算 1 (n=0,1) n*(n-1)! (n>1)
第三章 栈与队列
两种重要的,限定操作的线性结构。
§3.1 栈
栈的例子:操作系统中中断现场的保留等。
一、定义:限定只能在表尾进行插入或删除操作
的线性表。 修改原则:后进先出(LIFO)
练习:
设进栈顺序为1、2、3、4,请说出以下的出
栈顺序是否可能?
A、 1 2 3 4 C、 2 1 4 3 E、3 4 2 1 B、4 3 1 2 D、3 2 1 4 F 、3 4 1 2
循环队列队空、队满标志: 队满:(rear+1)mod max==front
队空:front=rear
冲突解决!!
练习:
设循环队列容量为70(序号0~69),现经 过一系列的入队和出队后,问下列情况下循 环队列中各有几个元素? (1)front=14,rear=21
(2)front=23,rear=12
§3.3两种存储结构比较(线性表):
顺序存储(数组): 思想简单,静态管理,定位方便;但会 有溢出问题,有时会有大量冗余,系统开销 大。 链式存储(链表): 操作方便,无冗余,解决溢出问题。
两个限定操作、用途广泛的线性表: 堆栈:LIFO 队列:FIFO
练习:
设有一顺序栈S,元素s1,s2,s3,s4,s5,s6
依次入栈,如果出栈顺序为
s2,s3,s4,s6,s5,s1,栈的容量至少为
(
B )。
A. 2 C. 5 B. 3 D. 6
设有一栈已有a1,a2,a3三个元素,栈顶为
a3,a4正等待入栈,则以下序列是不可能的出
栈序列是( A )。
A. a3,a1,a4,a2 B. a3,a2,a4,a1
C. a3,a4,a2,a1
SSXSXSSXXX后得到的序列为:
bceda
在一个链队中,如以f和r分别代表队头、队
尾指针,则插入s结点的操作为:
r->next=s; r=s;
分析:
gets(fun)
while (fun[i]!=’\0’) 否则 } {if (fun[i]==’(‘):入栈; if (fun[i]==‘)’): if 栈空:错,缺左边,return; else 出栈; i=i+1;
如栈空
对!!!
错,缺少右边
§3.2 队列
队列的例子:排队等。
一、定义:限定只能在表的一端进行插入,在表
的另一端进行删除的线性表。 修改原则:先进先出(FIFO)
二、队列的基本操作
进队、出队、清空、求队头元素…… 接下来学习线索:
存储方式:链式,顺序
行为特征
三、队列的链式存储结构
a
front
b
c
……
d
∧
rear
需设两个指针: front:头结点地址 rear:队尾结点地址
D. a4,a3,a2,a1
( T )在链队中,即使不设置尾指针也能进行入 队操作; ( T )在带头结点的链队中进行出队操作,不会 改变头结点地址front的值; ( F )循环队列中元素个数为rear-front
以S和X分别代表入栈和出栈,对输入序列a、
b、c、d、e进行一系列栈操作
“>”:运算符栈出一元素,操作数栈出两元素,
运算后,结果放回操作数栈;
“=”:运算符栈出一元素,与之相抵消。
(2)原理
算法结束标志:运算符栈为空,操作数 栈有一元素,即为结果。
上机:
输入一包含“(”和“)”的字符串,检测括号 是否匹配(其中括号中能嵌套括号),并输 出括号是否匹配的信息(匹配、缺少左括号、 缺少右括号);
基本操作:
1、初始化队列
∧
rear=front; front->link=NULL;
front rear
2、进队
从队尾进队列
基本操作:
2、进队 从队尾进队列
3、出队
只要队列不空,从队头出;
被删除结点如为队尾结点,队列置空。
四、队列的顺序存储结构
数组定义队列:queue[max]
规定:front指向队头元素位置 rear指向队尾元素的下一个空位
二、栈的基本操作
进栈、出栈、清空、求栈顶元素…… 接下来学习线索:
存储方式:顺序,链式
行为特征 应用实例
三、栈的顺序存储结构
数组定义栈:stack[max] 规定:top指向栈顶元素所在位置
初始:top=-1(空栈) 空栈:top=-1,出栈下溢
max-1
…
1 0
栈满:top=max-1,进栈上溢
进栈:
开始
Y
top==max-1? N top=top+1
上溢处理
stack[top]=x
结束
栈的顺序存 储结构有栈满的 情况,有可能出 现上溢的致命错 误。 多栈共享空 间是解决问题的 折中方法,但不 能完全解决。
出栈:
开始
Y
top==-1? N x=stack[top]
下溢处理
top=top-1