python数据结构习题汇总.docx

上传人:b****6 文档编号:6726417 上传时间:2023-01-09 格式:DOCX 页数:23 大小:113.30KB
下载 相关 举报
python数据结构习题汇总.docx_第1页
第1页 / 共23页
python数据结构习题汇总.docx_第2页
第2页 / 共23页
python数据结构习题汇总.docx_第3页
第3页 / 共23页
python数据结构习题汇总.docx_第4页
第4页 / 共23页
python数据结构习题汇总.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

python数据结构习题汇总.docx

《python数据结构习题汇总.docx》由会员分享,可在线阅读,更多相关《python数据结构习题汇总.docx(23页珍藏版)》请在冰豆网上搜索。

python数据结构习题汇总.docx

python数据结构习题汇总

第1章数据结构导论

一、选择题

1.算法的时间复杂度取决于A。

A.问题的规模B.变量的多少C.问题的难度D.A和B

2.算法能正确的顺利结束的特性为算法的B。

A.有效性B.有限性C.健壮性D.高效性

3.数据的物理结构主要包含A这几种结构。

A.顺序结构和链表结构B.线性结构和非线性结构

C.动态结构和静态结构D.集合、线性结构、树形结构、图形结构

4.数据在计算机内存中的表示是指A。

 A.数据的存储结构B.数据结构

 C.数据的逻辑结构D.数据元素之间的关系

5.数据结构被形式化定义为二元组(D,S),其中D是B的有限集合。

A.算法B.数据元素C.数据操作D.数据关系

6.算法效率的度量是D

A.正确度和简明度B.数据复杂度和程序复杂度

C.高的速度和正确度D.时间复杂度和空间复杂度

7.在存储数据时,通常不仅要存储各数据元素的值,还要存储D。

A.数据的存储方法B.数据处理的方法

C.数据元素的类型D.数据元素之间的关系

8.以下叙述不正确的是C。

A.数据结构是指数据以及数据相互之间的联系

B.数据结构主要指数据的逻辑结构,与计算机的存储和处理无关

C.数据的存储结构是指数据在计算机中的存储方式,主要包括线形和非线性

D.对于给定的n个元素,可以构造出的逻辑结构有多种

9.下列程序段违反了算法B特征。

count=0

whilecount!

=3:

print(count)

A.明确性B.有限性

C.有效性D.功能性

10.下列程序的时间复杂度为D。

foriinrange(1,n+1):

j=i

forkinrange(j+1,n+1):

x=x+1

A.O(i*j)B.O(n(n-1)/2)

C.O(n2/2)D.O(n2)

二、解答题

1.下列程序段中,函数my_fun(i,k)的执行次数是n(n+1)/2,该程序的时间复杂度为O(n^2)。

forkinrange(1,n+1):

foriinrange(0,k):

ifi!

=k:

my_fun(i,k)

2.求下列程序段中有数字标号的各语句的执行次数,然后求出该程序段的时间复杂度。

deffun(n):

①i=s=1

②whiles

i=i+1

③s=s+i

④returni

答:

11次

2(2n)^1/2次

3(2n)^1/2-1次

41次

5O(n^1/2)

第2章数组结构

一、选择题

1.线性表是一个A。

A.有限序列,可以为空B.有限序列,不能为空

C.无限序列,可以为空D.无限序列,不能为空

2.下面关于线性表的叙述中,错误的是B。

A.线性表采用顺序存储,必须占用一片连续的存储单元

B.线性表采用顺序存储,便于进行插入和删除操作

C.线性表采用链接存储,不必占用一片连续的存储单元

D.线性表采用链接存储,便于进行插入和删除操作

3.某线性表采用顺序存储结构,每个元素占4个存储单元,首地址为100,则第12个元素的存储地址为A。

A.144B.145C.147D.148

4.若长度为n的顺序存储结构线性表,删除第i个数据元素,需要向前移动A个数据元素。

A.n-iB.n+iC.n-i-1D.n-i+1

5.若长度为n的顺序存储结构线性表,在第i个位置插入一个元素,需要依次向后移动D个元素。

A.n-iB.n+iC.n-i-1D.n-i+1

6.一个顺序表所占存储空间的大小与D无关。

A.顺序表长度B.结点类型

C.结点中个数据域的类型D.结点的存放次序

7.以下叙述不正确的是D。

A.数据的逻辑结构包括线性和非线性结构,非线性结构包括树和图两种。

B.数据的逻辑结构主要指元素间的关系,与计算机的存储和处理无关

C.数据的存储结构是指数据在计算机中的存储方式,主要包括顺序和链式两种

D.对于给定的n个元素,可以构造出的逻辑结构有顺序表和链表两种

8.某线性表采用顺序存储结构,则下列叙述正确的是B。

A.删除顺序表第i个元素和在第i位置插入一个元素所需移动的元素个数一样

B.删除顺序表第i个元素和在第i位置插入一个元素的时间复杂度一样

C.删除顺序表第i个元素和取第i元素的值的时间复杂度一样

D.在顺序表表头插入和表尾插入的时间复杂度一样

9.对线性表,在下列情况下应当采用顺序表表示的是A。

A.经常需要随机地存取元素B.经常需要进行插入和删除操作

C.表中每个元素需要的字节数比较大D.表中的元素个数不变

10.在含有n个元素的顺序表中,算法的时间复杂度是O

(1)的操作是___A___。

A.访问第i个元素(1≤i≤n)和求第i个元素的直接前驱(2≤i≤n)

B.在第i个元素后插入一个新元素(1≤i≤n)

C.删除第i个元素(1≤i≤n)

D.将n个元素从小到大排序

二、填空题

1.一个一维数组(列表)A的长度为500,起始(A[0])地址为2000,每个元素占4个字节,则A[80]的地址是2320。

2.一个4*6的二维数组A,每个元素占4个字节,假设该数组起始元素A(1,1)的地址是110,若以行为主存储,则A(3,5)的地址是174;若以列为主存储,A(3,5)的地址是182。

3.以顺序存储结构实现的线性表简称为顺序表,它要求存储空间必须是连续的,并以下标来体现元素之间的关系,在顺序表中访问第i个元素的时间复杂度为O

(1),因此,顺序表也称为随机存取的数据结构。

以链式存储结构实现的线性表称为链表。

其存储空间可以是不连续的,以指针来体现元素之间的关系。

在链表中访问第i个元素的时间复杂度为O(n),因此,链表也称为顺序访问的数据结构。

三、算法设计题

1.设有一个顺序表L,其元素为整型数据,编写一个要求时间复杂度为O(n)、空间复杂度为O

(1)的算法,将L中所有小于0的整数放在前半部分,大于0的整数放在后半部分。

提示:

从L的两端查找,前端找大于0的数据,后端找小于0的数据,然后将两位置的数据交换。

L=[1,2,3,4,5,6,7,8,9,10,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]

n=len(L)

print("原顺序表:

\n{}".format(L))

j=0

k=0

foriinrange(n):

ifL[i]<0:

k=L[i]

L[i]=L[j]

L[j]=k

j+=1

else:

continue

print("排序后顺序表:

\n{}".format(L))

2.在一个有序列表中查找元素x,当被查元素x小于列表中某个元素时就可停止。

请编写一个函数实现上述查找,并分析此查找在最好情况、最坏情况以及平均情况下的性能。

deffound(L,x):

print("查找元素")

foriinL:

ifx>iorx==i:

print("元素x大于或等于{},程序继续".format(i))

continue

else:

print("元素x小于{},程序停止".format(i))

break

if__name__=="__main__":

x=eval(input("请输入要查找的元素x:

"))

L=[1,2,3,4,5,6,7,8,9]

found(L,x)

3.已知一个n*n的二维数组a已经以行为主存放在一个大小为n2的一维数组b中,编写一个函数计算此二维数组的主对角线元素之和。

count(b,n)

defcount(b,n):

x=0

i=0

whileTrue:

x+=b[i]

i+=n+1

ifi>len(b):

break

print("主对角线元素之和为:

%d"%x)

if__name__=="__main__":

a=[[1,2,3],[4,5,6],[7,8,9]]

b=[]

n=len(a)

print("二维数组A为:

")

foriinrange(n):

forjinrange(n):

b.append(a[i][j])

print("%d"%a[i][j],end='\t')

print()

print("存放在一维数组b中为:

")

print(b)

count(b,n)

4.有一值为整型、长度为n的顺序表(列表),写一个函数,计算该顺序表所有元素的平均值,并输出所有大于平均值的元素。

defAverage(L,n):

nsum=0

foriinrange(n):

nsum+=L[i]

average=nsum/n

print("平均数为:

%d"%average)

print("所有大于平均值的元素为:

")

foriinL:

ifi>average:

print(i,end='')

else:

continue

if__name__=="__main__":

L=[1,354,56,57,2,8,9,46,767,678]

n=len(L)

Average(L,n)

第3章链表

一、选择题

1.以下关于链式存储结构的叙述中,C是不正确的。

A.结点除自身信息外还包括指针域,因此空间利用率小于顺序存储结构

B.逻辑上相邻的结点物理上不必邻接

C.可以通过计算直接确定第i个结点的存储地址

D.插入、删除运算操作方便,不必移动结点

2.在下列存储结构中,最适合实现在线性表中进行随机访问的是A。

A.数组B.双向链表C.单向链表D.循环链表

3.与单链表相比,双链表的优点之一是D。

A.可以由最后一个结点找到头结点B.可随机访问

C.插入、删除操作更加简单D.访问前驱结点更加方便

4.如果对线性表的运算只有2种,即删除第一个元素,在最后一个元素的后面插入新元素,则最好使用D。

A.顺序表B.单链表C.双向链表D.具有表尾指针的循环单链表

5.在表头指针为head且表长大于1的单向循环链表中,指针p指向表中的某个结点,若p.next.next==head,则D。

A.p指向头结点B.p指向尾结点

C.p所指结点的直接后继是头结点D.p所指结点的直接后继是尾结点

6.带表头附加结点的单链表head为空的判断条件是B。

A.head==None#不带头结点的空链表

B.head.next==None

C.head.next==head

D.head!

=None

7.一个单链表中,若要在指针s所指结点的后面插入一个由指针P所指向的结点,则执行D。

A.s.next=pp.next=s.next;

B.p.next=s.nexts=p

C.s.next=p.nextp.next=s

D.p.next=s.nexts.next=p

8.对线性表,在下列情况下应当采用链表表示的是B。

A.经常需要随机地存取元素

B.经常需要进行插入和删除操作

C.表中元素需要占据一片连续的存储空间

D.表中的元素个数不变

9.如果最常用的操作是取第i个结点及前驱,则采用A存储方式最节省时间。

A.顺序表B.双链表C.单循环链表D.单链表

10.从一个具n个结点的单链表中查找其值等于x的结点时,在查找成功的情况下,需平均比较D个结点。

A.nB.n/2C.(n-1)/2D.(n+1)/2

11.在单链表中,指针p指向元素为x的结点,实现删除x的后继的语句是B。

A.p=p.nextB.p.next=p.next.next

C.p.next=pD.p=p.next.next

12.循环链表的主要优点是D。

A.不再需要头指针了

B.已知某个结点的位置后,能很容易找到它的直接前驱结点

C.在进行删除操作后,能保证链表不断开

D.从表中任一结点出发都能遍历整个链表

二、填空题

1.一个单链表结构中,每个结点都包含有两个域,称为数据域和指针域。

2.已知一个双向链表(指针域名为next和prior)中间局部如下图所示,

现要求将p所指的结点插入到x和y结点之间(即p所指结点后面),其操作步骤为:

p.next=q.next;p.prior=q;

q.next=p;p.next.prior=p;

2.已知L是不带头结点的单链表,阅读下列函数,回答问题。

deffun(L):

#L是不带头结点的单链表的头指针

if(L!

=None&&L.next!

=None):

#语句1

q=L

L=L.next

p=L

while(p.next!

=None):

#语句5

p=p.next

p.next=q

q.next=None

returnL;

(1)说明该函数执行的条件,即语句1的功能

Len(L)>1

(2)说明语句5(即while循环)的功能

查找尾结点

(3)若链表L的初始状态如下图,画出执行上述函数后的链表L的示意图。

L

q

p

三、算法设计题

1.编写一个函数,实现从单链表中查找出所有元素的最大值,该值由函数返回。

deffun(L):

ifL.next=None:

return0

Max=L.next.data

p=L.next.next

whilep!

=None:

ifp.data>max:

max=p.data

p=p.next

returnmax

2.编写一个函数,实现单链表中删除一个最小值节点的算法(假设该链表中每个节点的值不重复)。

deffun1(L):

ifL.next=None:

returnNone

ptr=L.next

p=L.next.next

whilep!

=None:

ifp.data

ptr=p

p=p.next

p=L

Whilep.next!

=ptr:

p=p.next

P.next=p.next.next#p.next=ptr.next

3.假设有一个循环链表的长度大于1,且表中既无头结点也无头指针。

已知s为指向链表某个结点的指针,编写算法在链表中删除指针s所指结点的前驱结点。

deffun(s):

p=s.next

Whilep.next.next!

=s:

p=p.next

p.next=s

第4章栈+第5章队列

一、选择题

1.有5个元素a,b,c,d,e依次进栈,允许任何时候出栈,则可能的出栈序列是C。

A.baecdB.dceabC.abedcD.aebcd

2.下列有关递归的叙述,不正确的是B。

A.在计算机系统内,执行递归函数是通过自动使用栈来实现的。

B.在时间和空间效率方面,递归算法比非递归算法好。

C.递归函数的求解过程分为递推(进栈)和回推(出栈)两个阶段。

D.在递归函数中必须有终止递归的条件。

3.栈和队列均属于哪一种逻辑结构A。

A.线性结构B.顺序结构C.非线性结构D.链表结构

4.设输入元素为1、2、3、P和A,输入次序为123PA,元素经过栈后得到各种输出序列,则可以作为高级语言变量名的序列有B种。

A.4B.5C.6D.7

5.一个队列的入队序列为a,b,c,d,则该队列的输出序列是B。

A.dcbaB.abcdC.adcbD.cbda

6.在一个链式队列中,假设f和r分别为队头和队尾指针,则插入s所指结点的运算是B。

A.f.next=s;f=s;B.r.next=s;r=s;

C.s.next=s;r=s;D.s.next=f;f=s;

7.如果5个元素出栈的顺序是1、2、3、4、5,则进栈的顺序可能是C。

A.3、5、4、1、2B.1、4、5、3、2

C.5、4、1、3、2D.2、4、3、1、5

8.已知一个栈的进栈序列为1,2,3,…,n,其出栈输出序列是p1,p2,p3,…,pn。

若p1=3,则p2的值D。

A.一定是2B.一定是1C.可能是1D.可能是2

9.以1,2,3,…,n的顺序进队列,则可能的出队序列有A种。

A.1B.nC.n(n+1)/2D.

10.在计算递归函数时,如不用递归过程,应借助于B这种数据结构。

A.线性表B.栈C.队列D.双向队列

二、填空题

1.栈和队列是一种特殊的线性表,其特殊性体现在是运算受限线性表。

设现有元素e1,e2,e3,e4,e5和e6依次进栈,若出栈的序列是e2,e4,e3,e6,e5,e1,则栈S的容量至少是3。

2.顺序循环队列中,设队头指针为front,队尾指针为rear,队中最多可有MAX个元素,采用少用一个存储单元的方法区分队满与队空问题,则元素入队列时队尾指针的变化为

rear=(rear+1)%MAX;元素出队列时队头指针的变化为front=(front+1)%MAX;队列中的元素个数为 (rear-front+MAX)%MAX 。

队满的判别条件为为(rear+1)%MAX==front,队空的判别条件为front==rear。

3.一个中缀表达式a+b*(a+c)-c/d的前缀表达式为-+a*b+ac/cd,后缀表达式为abac+*+cd/-。

一个后缀表达式21+42-*3+的值为9。

4.下列函数的功能是求n^2+(n-1)^2+(n-2)^2+……+1的和。

defsum(n):

ifn==0:

return0

else:

returnsum(n-1)+n*n

5.下列算法的功能判断输入的字符串是否是回文。

deffunc():

creatstack(S)#初始化构造一个空栈S

creatqueue(Q)#初始化构造一个空队列Q

str=input(“输入一个字符串:

”)

forchinstr:

push(ch)

enqueue(ch)

whilenotisempty(S):

a=pop()

b=dequeue()

ifa!

=b:

return0

return1

三、解答题

1.用一维数组a[7]顺序存储一个循环队列,队首和队尾指针分别用front和rear表示,当前队列中已有5个元素:

22,30,16,36,58,其中22是队首,front值为5,请画出对应的存储状态图,当连续做两次出队运算后,再做两次入队运算,让元素80,55依次进队,请再画出对应的存储状态图。

2.用一个带头结点的循环链表来表示循环队列,且该队列只设尾指针。

编写初始化、入队、出队操作算法。

classQnode:

def__init__(self,data,next=None):

self.data=data

self.next=None

rear=Qnode()

rear.next=rear

defenqueue(item):

globalrear

newQueue=Qnode()

newQueue.data=item

newQueue.next=rear.next

rear.next=newQueue

rear=newQueue

defdequeue(item):

globalrear

ifrear.next=rear:

print(“队列已空!

”)

else:

item=rear.next.data

rear.next=rear.next.next

returnitem

第5章树形结构

一、选择题

1.按照二叉树定义,具有3个结点的二叉树共有C种形态。

(A)3(B)4(C)5(D)6

2.具有五层结点的完全二叉树至少有D个结点。

(A)9(B)15(C)31(D)16

3.以下有关二叉树的说法正确的是B。

(A)二叉树的度为2(B)一棵二叉树的度可以小于2

(C)至少有一个结点的度为2(D)任一结点的度均为2

4.已知二叉树的后序遍历是dabec,中序遍历是debac,则其前序遍历是D。

(A)acbed(B)decab(C)deabc(D)cedba

5.将一棵有1000个结点的完全二叉树从上到下,从左到右依次进行编号,根结点的编号为1,则编号为49的结点的右孩子编号为B。

(A)98(B)99(C)50(D)没有右孩子

6.对具有100个结点的二叉树,若有二叉链表存储,则其指针域共有D为空。

说明:

n=n0+n1+n2

指针域为空的个数:

2*n0+n1=n0+n1+n2+1=101

(A)50(B)99(C)100(D)101

7.设二叉树的深度为h,且只有度为1和0的结点,则此二叉树的结点总数为C。

(A)2h(B)2h-1(C)h(D)h+1

8.对一棵满二叉树,m个树叶,n个结点,深度为h,则D。

(A)n=h+m(B)h+m=2n(C)m=h-1(D)n=2h-1

9.某二叉树的先序序列和后序序列正好相反,则下列说法错误的是A。

(A)二叉树不存在

(B)若二叉树不为空,则二叉树的深度等于结点数

(C)若二叉树不为空,则任一结点不能同时拥有左孩子和右孩子

(D)若二叉树不为空,则任一结点的度均为1

10.对二叉树的结点从1开始进行编号,要求每个结点的编号大于其左右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用C遍历实现编号。

(A)先序(B)中序(C)后序(D)层序

11.一个具有1025个结点的二叉树的高h为C。

(A)10(B)11(C)11~1025(D)10~1024

12.设n,m为一棵二叉树上的两个结点,在中序遍历时,n在m前的条件是C。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1