数据结构习题.docx
- 文档编号:30515762
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:26
- 大小:122.29KB
数据结构习题.docx
《数据结构习题.docx》由会员分享,可在线阅读,更多相关《数据结构习题.docx(26页珍藏版)》请在冰豆网上搜索。
数据结构习题
4.1栈
一、填空题
1.栈是一种特殊的线性表,允许插入和删除运算的一端称为。
不允许插入和删除运算的一端称为。
2.在操作序列push
(1),push
(2),pop(),push(5),push(7),pop(),push(6)之后,栈顶元素是,栈底元素是。
二、选择题
1.栈中元素的进出原则是()。
A.先进先出B.后进先出C.栈空则进D.栈满则出
2.若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为()
A.iB.n=iC.n-i+1D.不确定
3.判定一个栈ST(最多元素为m)为空的条件是()
A.top<>0B.top=0C.top<>mD.top=m
表达式的求值
问题:
能否设计算法,编制一个程序,让计算机扫描如下表达式,并将其值打印出来。
(3*(4+8)/2-5)注:
给表达式设置#,标志扫描的开始和结束。
提示算法:
设两个栈,一个是操作数栈,用来存放操作数,如3、4、8等,另一个是运算符栈,用来存放运算符。
首先将标志“(”进运算符栈的栈底。
然后依次扫描,按照栈的后进先出原则进行:
(1)遇到操作数,进操作数栈;
(2)遇到运算符时,则需将此运算符的优先级与栈顶运算符的优先级比较,
若若高于栈顶元素则进栈,继续扫描下一符号,
否则,将运算符栈的栈顶元素退栈,形成一个操作码Q,同时操作数栈的栈顶元素两次退栈,形成两个操作数a、b,让计算机对操作数与操作码完成一次运算操作,即aQb,并将其运算结果存放在操作数栈中……
模拟计算机处理算术表达式过程。
从键盘上输入算术表达式串(只含+、-、×、÷运算符,充许含括号),输出算术表达式的值。
设输入的表达式串是合法的。
programexsj_1;
const
max=100;
var
number:
array[0..max]ofinteger;
symbol:
array[1..max]ofchar;
s,t:
string;
i,p,j,code:
integer;
procedurepush;{算符入栈运算}
begin
1;
symbol[p]:
=s[i];
end;
procedurepop;{运算符栈顶元素出栈,并取出操作数栈元素完成相应的运算}
begin
p:
=p-1;
case2of
'+':
inc(number[p],number[p+1]);
'-':
dec(number[p],number[p+1]);
'*':
number[p]:
=number[p]*number[p+1];
'/':
number[p]:
=number[p]divnumber[p+1];
end;
end;
functioncan:
boolean;{判断运算符的优先级别,建立标志函数}
begin
can:
=true;
if(s[i]in['+','-'])and(symbol[p]<>'(')thenexit;
if(s[i]in['*','/'])and(symbol[p]in['*','/'])thenexit;
3;
end;
begin
write('String:
');readln(s);s:
='('+s+')';i:
=1;p:
=0;
whilei<=length(s)do
begin
whiles[i]='('do{左括号处理]}
begin
4;
i:
=i+1;
end;
j:
=i;
repeat{取数入操作数栈}
i:
=i+1;
until(s[i]<'0')or(s[i]>'9');
t:
=copy(s,j,i-j);val(t,number[p],code);
repeat
ifs[i]=')'then{右括号处理}
begin
whilesymbol[p]<>'('do5;
p:
=p-1;
number[p]:
=number[p+1];
end
else
begin{根据标志函数值作运算符入栈或出栈运算处理}
whilecando6;
push;
end;
i:
=i+1;
until(i>length(s))or(s[i-1]<>')');
end;
write('Result=',number[0]);
readln;
end.
4.2队列
一、填空题
1.对于栈只能在插入和删除元素;对于队列只能在插入和删除元素。
2.是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。
3.在操作序列enqueue
(1),enqueue
(2),dequeue(),enqueue(5),enqueue(7),dequeue(),enqueue(9)之后,队头元素是,队尾元素是。
二、选择题
1.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中个数元素的公式为()
A.r-fB.(n+f-r)modnC.n+r-fD.(n+r-f)modn
2.假定一个链队的队首和队尾指针分别为front和rear,则判断队空的条件为()。
A.Front=rearB.Front<>NILC.Rear<>NiLD.Front=NiL
3.设有4个数据元素a1、a2、a3和a4,对他们分别进行栈操作或队操作。
在进栈或进队操作时,按a1、a2、a3、a4次序每次进入一个元素。
假设栈或队的初始状态都是空。
现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;这时,第一次出栈得到的元素是,第二次出栈得到的元素是是;类似地,考虑对这四个数据元素进行的队操作是进队两次,出队一次,再进队两次,出队一次;这时,第一次出队得到的元素是,第二次出队得到的元素是。
经操作后,最后在栈中或队中的元素还有
个。
A.a1B.a2C.a3D.a4E.1F.2G.3H.0
队列的应用
例1:
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
如:
阵列
023*******
1004560500
2045600671
0000000089
有4个细胞。
算法步骤:
1.从文件中读入m*n矩阵阵列,将其转换为boolean矩阵存入bz数组中;
2.沿bz数组矩阵从上到下,从左到右,找到遇到的第一个细胞;
3.将细胞的位置入队h,并沿其上、下、左、右四个方向上的细胞位置入队,入队后的位置bz数组置为FLASE;
4.将h队的队头出队,沿其上、下、左、右四个方向上的细胞位置入队,入队后的位置bz数组置为FLASE;
5.重复4,直至h队空为止,则此时找出了一个细胞;
6.重复2,直至矩阵找不到细胞;
7.输出找到的细胞数。
程序:
programxibao;
constdx:
array[1..4]of-1..1=(-1,0,1,0);
dy:
array[1..4]of-1..1=(0,1,0,-1);
varint:
text;
name,s:
string;
pic:
array[1..50,1..79]ofbyte;
bz:
array[1..50,1..79]ofboolean;
m,n,i,j,num:
integer;
h:
array[1..4000,1..2]ofbyte;
proceduredoing(p,q:
integer);
vari,t,w,x,y:
integer;
begin
inc(num);bz[p,q]:
=false;
t:
=1;w:
=1;h[1,1]:
=p;1;{遇到的第一个细胞入队}
repeat
fori:
=1to4do{沿细胞的上下左右四个方向搜索细胞}
begin
x:
=2;y:
=3;
if(x>0)and(x<=m)and(y>0)and(y<=n)andbz[x,y]
thenbegininc(w);h[w,1]:
=x;h[w,2]:
=y;bz[x,y]:
=false;end;{为细胞的入队}
end;
inc(t);{队头指针加1}
untilt>w;{直至队空为止}
end;
begin
fillchar(bz,sizeof(bz),true);num:
=0;
write('inputfile:
');readln(name);
assign(int,name);reset(int);
readln(int,m,n);
fori:
=1tomdo
beginreadln(int,s);
forj:
=1tondo
beginpic[i,j]:
=4;
ifpic[i,j]=0thenbz[i,j]:
=5;
end;
end;
close(int);
fori:
=1tomdo
forj:
=1tondoifbz[i,j]then6;{在矩阵中寻找细胞}
writeln('NUMBERofcells=',num);readln;
end.
树习题
1.已知一算术表达式的中缀形式为A+B*C-D/E,后缀形式为ABC*+DE/-,其前缀形式为()A.-A+B*C/DEB.-A+B*CD/EC.-+*ABC/DED.-+A*BC/DE
2.算术表达式a+b*(c+d/e)转为后缀表达式后为()
A.ab+cde/*B.abcde/+*+C.abcde/*++D.abcde*/++
3.设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1则T中的叶子数为()A.5B.6C.7D.8
4.在下述结论中,正确的是()
①只有一个结点的二叉树的度为0;②二叉树的度为2;③二叉树的左右子树可任意交换;
④深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。
A.①②③B.②③④C.②④D.①④
5.设森林F对应的二叉树为B,它有m个结点,B的根为p,p的右子树结点个数为n,森林F中第一棵树的结点个数是()
A.m-nB.m-n-1C.n+1D.条件不足,无法确定
6.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是()
A.9B.11C.15D.不确定
7.在一棵三元树中度为3的结点数为2个,度为2的结点数为1个,度为1的结点数为2个,则度为0的结点数为()个
A.4B.5C.6D.7
8.具有10个叶结点的二叉树中有()个度为2的结点,
A.8B.9C.10D.ll
9.一棵完全二叉树上有1001个结点,其中叶子结点的个数是()
A.250B.500C.254D.505E.以上答案都不对
10.设给定权值总数有n个,其哈夫曼树的结点总数为()
A.不确定B.2nC.2n+1D.2n-1
11.有n个叶子的哈夫曼树的结点总数为()。
A.不确定B.2nC.2n+1D.2n-1
12.有关二叉树下列说法正确的是()
A.二叉树的度为2B.一棵二叉树的度可以小于2
C.二叉树中至少有一个结点的度为2D.二叉树中任何一个结点的度都为2
13.二叉树的第I层上最多含有结点数为()
A.2IB.2I-1-1C.2I-1D.2I-1
14.一个具有1025个结点的二叉树的高h为()
A.11B.10C.11至1025之间D.10至1024之间
15.一棵二叉树高度为h,所有结点的度或为0,或为2,则这棵二叉树最少有()结点
A.2hB.2h-1C.2h+1D.h+1
16.对于有n个结点的二叉树,其高度为()
A.nlog2nB.log2nC.log2n+1D.不确定
17.一棵具有n个结点的完全二叉树的树高度(深度)是()
A.log2n+1B.log2n+1C.log2nD.log2n-1
18.深度为h的满m叉树的第k层有()个结点。
(1= A.mk-1B.mk-1C.mh-1D.mh-1 19.在一棵高度为k的满二叉树中,结点总数为() A.2k-1B.2kC.2k-1D.log2k+1 20.将有关二叉树的概念推广到三叉树,则一棵有244个结点的完全三叉树的高度() A.4B.5C.6D.7 21.对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用()次序的遍历实现编号。 A.先序B.中序C.后序D.从根开始按层次遍历 22.一棵二叉树的前序遍历序列为ABCDEFG,它的中序遍历序列可能是() A.CABDEFGB.ABCDEFGC.DACEFBGD.ADCFEG 23.已知一棵二叉树的前序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历的结果为()。 A.CBEFDAB.FEDCBAC.CBEDFAD.不定 24.已知某二叉树的后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历是()。 A.acbedB.decabC.deabcD.cedba 25.某二叉树中序序列为A,B,C,D,E,F,G,后序序列为B,D,C,A,F,G,E则前序序列是: A.E,G,F,A,C,D,BB.E,A,C,B,D,G,FC.E,A,G,C,F,B,DD.上面的都不对 26.上题的二叉树对应的森林包括多少棵树() A.lB.2C.3D.概念上是错误的 27.下面的说法中正确的是(). (1)任何一棵二叉树的叶子结点在三种遍历中的相对次序不变; (2)按二叉树定义,具有三个结点的二叉树共有6种。 A. (1) (2)B. (1)C. (2)D. (1)、 (2)都错 28.对于前序遍历与中序遍历结果相同的二叉树为 (1);对于前序遍历和后序遍历结果相同的二叉树为 (2)。 A.一般二叉树B.只有根结点的二叉树C.根结点无左孩子的二叉树 D.根结点无右孩子的二叉树E.所有结点只有左子数的二叉树F.所有结点只有右子树的二叉树 29.一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足() A.所有的结点均无左孩子B.所有的结点均无右孩子C.只有一个叶子结点D.是任意一棵二叉树 30.在二叉树结点的先序序列,中序序列和后序序列中,所有叶子结点的先后顺序() A.都不相同 B.完全相同C.先序和中序相同,而与后序不同 D.中序和后序相同,而与先序不同 31.某二叉树的前序序列和后序序列正好相反,则该二叉树一定是()的二叉树。 A.空或只有一个结点B.任一结点无左子树 C.高度等于其结点数D.任一结点无右子树 32.由3个结点可以构造出多少种不同的二叉树? () A.2B.3C.4D.5 33.当一棵有n个结点的二叉树按层次从上到下,同层次从左到右将数据存放在一维数组A[l..n]中时,数组中第i个结点的左孩子为() A.A[2i](2i<=n)B.A[2i+1](2i+1<=n)C.A[i/2]D.无法确定 34.一棵有n个结点的二叉树,按层次从上到下,同一层从左到右顺序存储在一维数组A[1..n]中,则二叉树中第i个结点(i从1开始用上述方法编号)的右孩子在数组A中的位置是()A.A[2i](2i<=n)B.A[2i+1](2i+1<=n) C.A[i-2]D.条件不充分,无法确定 35.n个结点的完全二叉树存储在数组a中,下面为非递归的先序遍历算法。 PROCpreorder(a); BEGIN top: =0;t: =1; WHILE(t<=n)OR (1)___DO BEGIN WHILEt<=nDO BEGIN write(a[t]);top: =top+1;s[top]: =t;t: = (2)_; END; IFtop>0THENBEGINt: =s[top]*2+1;top: =(3)__;END; END; END; 36.设有正文AADBAACACCDACACAAD,字符集为A,B,C,D,设计一套二进制编码,使得上述正文的编码最短。 4.4图 判断题 1.图可以没有边,但不能没有顶点()。 2.在有向图中, 3.邻接表只能用于有向图的存储()。 4.用邻接矩阵法存储一个图时,在不考虑压缩存储的情况下,所占用的存储空间大小只与图中顶点个数有关,而与图的边数无关()。 5.若以某个顶点开始,对有n个顶点的有向图G进行深度优先遍历,所得的遍历序列惟一,则可以断定其边数为n-l()。 6.有向图不能进行广度优先遍历。 7.若一个无向图以顶点V1为起点进行深度优先遍历,所得的遍历序列惟一,则可以惟一确定该图()。 填空题 1.若图G中每条边都方向,则G为无向图。 有n条边的无向图邻接矩阵中,l的个数是。 2.若图G中每条边都方向,则G为有向图。 3.图的邻接矩阵是表示之间相邻关系的矩阵。 4.有向图G用邻接矩阵存储,其第i行的所有元素之和等于顶点i的。 5.n个顶点的完全图有条边。 选择题 1.在一个图中,所有顶点的度数之和等于图的边数的()倍。 A.l/2B.1C.2D.4 2.在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的()倍。 A.l/2B.1C.2D.4 3.有8个结点的无向图最多有()条边。 A.14B.28C.56D.112 4.有8个结点的无向连通图最少有()条边。 A.5B.6C.7D.6 5.有8个结点的有向完全图有()条边。 A.14B.28C.56D.112 6.广度优先遍历类似于二叉树的()。 A.先序遍历B.中序遍历C.后序遍历D.层次遍历 7.无向图顶点v的度是关联于该顶点()的数目。 A.顶点B.边C.序号D.下标 综合题 1.有n个选手参加的单循环比赛要进行多少场比赛? 试用图结构描述。 若是主客场制的联赛,又要进行多少场比赛? 2.对下图,求出从顶点1到其余各顶点的最短路径。 循环 次数 集合s 选中的顶点号 dist path 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 初值 1 1 1 2 3 4 5 6 7 4.1栈 一、填空题 1.栈顶,栈底2.6,1 二、选择题 1.B2.C3.B programexsj_1; const max=100; var number: array[0..max]ofinteger; symbol: array[1..max]ofchar; s,t: string; i,p,j,code: integer; procedurepush;{算符入栈运算} begin p: =p+1; symbol[p]: =s[i]; end; procedurepop;{运算符栈顶元素出栈,并取出操作数栈元素完成相应的运算} begin p: =p-1; casesymbol[p+1]of '+': inc(number[p],number[p+1]); '-': dec(number[p],number[p+1]); '*': number[p]: =number[p]*number[p+1]; '/': number[p]: =number[p]divnumber[p+1]; end; end; functioncan: boolean;{判断运算符的优先级别,建立标志函数} begin can: =true; if(s[i]in['+','-'])and(symbol[p]<>'(')thenexit; if(s[i]in['*','/'])and(symbol[p]in['*','/'])thenexit; can: =false; end; begin write('String: ');readln(s);s: ='('+s+')';i: =1;p: =0; whilei<=length(s)do begin whiles[i]='('do{左括号处理]} begin push; i: =i+1; end; j: =i; repeat{取数入操作数栈} i: =i+1; until(s[i]<'0')or(s[i]>'9'); t: =copy(s,j,i-j);val(t,number[p],code); repeat ifs[i]=')'then{右括号处理} begin whilesymbol[p]<>'('dopop; p: =p-1; number[p]: =number[p+1]; end else begin{根据标志函数值作运算符入栈或出栈运算处理} whilecandopop; push; end; i: =i+1; until(i>length(s))or(s[i-1]<>')'); end; write('Result=',number[0]); readln; end. 4.2队列 一、填空题 1.栈顶,队头,队尾2.队列3.5,9 二、选择题
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 习题
![提示](https://static.bdocx.com/images/bang_tan.gif)