简单的数据结构Word文档格式.docx
- 文档编号:15843667
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:22
- 大小:236.84KB
简单的数据结构Word文档格式.docx
《简单的数据结构Word文档格式.docx》由会员分享,可在线阅读,更多相关《简单的数据结构Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
stack;
2.进栈过程push(s,x,top)——往栈S中压人一个值为X的数据项
procedurepush(vars:
x:
stype;
vartop:
integer);
BEGIN
iftop=0thenwrite(’underflow’)
else
top:
=top+1;
s[top]:
=x;
END;
3.出栈函数pop(s,top)——从栈中弹出一个数据项
functionpop(vars:
integer):
BEGIN
iftop=0thenwriteln(’underflow’)
pop:
=s[top];
=top-1;
4.读数函数stop(s,top)——读栈顶的数据项
functionstop(vars:
t:
iftop=0thenwriteln(’stackempty’)
elsestop:
END
栈的用途极为广泛,在源程序编译中表达式的计算、过程的嵌套调用和递归调用等都要用到栈.
从历届初赛可以看出,栈也是属于比较容易出题的知识点,选择题、解答题等题型都有可能出现.
例、设输入元素为1、2、3、P和A,输人次序为123PA,如图4.1.2所示,元素经过栈后到达输出序列,当所有元素均到达输出序列后,有哪些序列可以作为高级语言的变量名?
高级语言变量名的定义规则:
以字母开头,字母与数字的组合.
由于必须以字母开头,所以,第一个可能出现的字母是P,那么必然要求123已经先后入栈,这样便可得到以P开头的、并且123按逆序排列的(即321)、同时A位于P后任一位置的变量名序列.此外,还需要考虑以A开头的可能情况,这只有一种情形:
AP321.所以AP321,PA321,P3A21,P32A1,P321A可以作为高级语言的变量名.
例、中缀表达式A-(B+C/D)*E的后缀形式是什么?
中缀形式:
即一般情况下的表达方式,将运算符写于参与运算的操作数的中间,操作数依原序列排。
后缀形式:
式中不再引人括号,运算符放在参与运算的操作数之后,操作数的排列依原序列,所有计算按运算符出现的顺序,严格地由左而右进行(不再考虑运算符的优先规则).所以利用椎栈的特性,可以得出本题的答案是ABCD/+E*-。
前缀表达式:
同后缀表达式一样,不包含括号,运算符放在两个运算对象的前,如-A*+B/CDE。
【练习题】单项选择题
1、设栈S的初始状态为空,元素a,b,c,d,e,f依次入栈,出栈顺序为b,d,c,f,e,a那么栈容量至少应该是()。
A.6B.5C.4D.3E.2
2、一个栈的入栈序列为a,b,c,d,e,则栈的不可能输出序列为()
A、edcbaB、decbaC、dceabD、abcde
3.设栈的输人序列为1、2、3、……、n,输出序列为al、a2、……、an,若存在1<
=k<
=n使得ak=n,则当k<
=i<
=n时,ai为().
A.n-i+1B.n-(i-k)C.不确定
4、设栈的输入序列是(1、2、3、4),则()不可能是其出栈序列.
A.1243B.2134
C.1432D.4312
E.3214
5、已知一算术表达式的中缀形式为A+B*C—D/E,其后缀形式为ABC*+DE/一,其前缀形式为().
A.-A+B*C/DEB.-A+B*CD/EC.-+*ABC/DED.-+A*BC/DE
6、设栈的输入序列是1、2、…、n,若输出序列的第一个元素是n,则第i个输出元素是()
A.不确定B.n-i+l
C.iD.n-i
4.2队列
队列是限定在一端进行插入,另一端进行删除的特殊线性表。
正像排队买东西,排在前面人买完东西后离开队伍(删除),而后来的人总是排在队伍末尾(插入).通常把队列的删除和插分别称为出队和人队.允许出队的一端称为队首,允许人队的一端称为队尾.所有需要进队数据项,只能从队尾进人,队列中的数据项只能从队首离去.由于总是先入队的元素先出队(排队的人先买完东西),这种表也称为“先进先出"
(FIFO)表.
队列可以用数组Q[1…m]来存储,数组的上界m即是队列所容许的最大容量.在队列的算中需设两个指针:
head:
队首指针,指向实际队头元素的前一个位置
tail:
队尾指针,指向实际队尾元素所在的位置
队列中拥有的元素个数为:
L=tail—head.一般情况下,两个指针的初值设为O,这时队列为空,没有元素.
用Pascal语言模拟队列的定义和操作.
1.队列的定义
CONST
m=队列元素的上限;
TYPE
equeue=array[1..m]ofqtype;
{队列的类型定义}
VAR
q:
equeue;
{队列}
head,tail:
integer;
{队首指针与队尾指针}
2.人队过程add(q,x,taxi)——在队列的尾端插入元素x
procedureadd(varq:
qtype;
vattail:
BEGIN
iftail:
mthenwriteln(’overflow’){队列满上溢}
tail:
=tail+l;
q[tail]:
END
END;
3.出队过程del(q,y,head,tail)——取出q队列的队首元素Y
proceduredel(varq:
Vary:
Varhead,tail:
ifhead=tailthenwriteln(’underflow’){列表空下溢}
else
head:
=head+1;
y:
=q[head];
END
对循环队列的操作要区别于一般队列:
(1)初始时队列空,队首指针和队尾指针均指向存储空间的最后一个位置,即head=tail:
m.
(2)入队运算时,尾指针进一,即
iftail=m+1thentail:
=1
这两条语句可用一条语句替代:
=tailmodm+1
(3)出队运算时,首指针进一,即
head:
=head+1;
ifhead=m+1thenhead:
=headmodm+1
(4)队列空时,head=tail
(5)队列满时,head=tailmodm+1
为了区分队列空和队列满,改用“队尾指针追上队首指针’’这一特征作为队列满标志.这种处理方法的缺点是浪费队列空间的一个存储单元.
所以,我们重新得到另外两种循环队列的运算.
1.人队过程add(q,x,taxi)——在队列的尾端插入元素x
procedureadd(vatq:
vartajl:
VARt:
t:
=tailmodm+1;
ift=headthenwriteln(’full’)
else
=t;
q[tail]:
END;
2.出队过程del(q,y,head,tail)——取出q队列的队首元素y
vary:
varhead:
ifhead=tailwriteIn('
empty’)
BEGIN
=headmodm+1;
y:
=q[head];
【练习题】单项选择题:
1.若用一个大小为6的数组来实现循环队列,且当一和front的值分别为0和3。
当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?
A.1和5B.2和4
C.4和2D.5和1
2.设栈S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5和e6依次通过栈S,一个元素出栈后即进入队列Q,若6个元素出队的序列是e2、e4、e3、e6、e5、e1,则栈S的容量至少应该是().
A.6B.4
C.3D.2
3.如右图所示的循环队列中元素数目是().其中
tail=32指向队尾元素,head=15指向队首元素的前
一个空位置,队列空间m=60.
A.42B.16
C.17D.41
4.3树
前两节学习的栈和队列属于线性结构.在这种结构中,数据元素的逻辑位置之间呈线性关系,每一个数据元素通常只有一个前件(除第一个元素外)和一个后件(除最后一个元素外).在实际生活中,可以用线性结构描述数据元素之间逻辑关系的问题是很广泛的,但也有很多问题不能依靠线性结构来解决,例如家谱、行政组织机构等都是非线性的数据结构.其中树就是一种非线性的数据结构.
(一)树的递归定义为树(Tree)是n(n≥O)个结点的有限集T,T为空时称为空树,否则它满足
如下两个条件:
(1)有且仅有一个特定的称为根(Root)的结点;
(2)其余的结点可分为m(m≥0)个互不相交的子集,T1,T2,…,Tm,其中每个子集本身又是一棵树,并称其为根的子树(Subtree).
比如在现实生活中,有如下血统关系的家族可用树形图(图4-3-1)表示:
张源有三个孩子张明、张亮和张丽;
张明有两个孩子张林和张维;
张亮有三个孩子张平和张群;
张丽有两个孩子张晶和张磊.
以上表示很像一棵倒画的树.其中“树根”是张源,树的“分支点"
是张明、张亮和张平,该家族的其余成员均是“树叶"
,而树枝(即图中的线段)则描述了家族成员之间的关系.显然,以张源为根的树是一个大家庭.它可以分成张
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 数据结构