数据结构每日练习

专业课每日一题练习

数据结构:

这个已经很久没更新了 只是停留在简单的栈队列等部分 其实后面还有一些也同样是重点的部分 如果想要刷题可以建议去看看计算机相关刷题小程序 内容更加丰富些。

1、以下数据结构中( )属非线性结构。

A、栈 B、串 C、队列 D、平衡二叉树

解析:D

栈、串和队列中元素之间的关系均为线性关系,平衡二叉树属于树形结构。

2、以下属于逻辑结构的是( )

A、顺序表 B、哈希表 C、有序表 D、单链表

解析:C

顺序表、单链表和哈希表都属于存储结构,只有有序表属于逻辑结构。

3、以下函数中时间复杂度最小的的是( )

A、T1(n)= n l o g 2 n nlog_2n nlog2n+5000n B、T2(n)= n 2 n^2 n2-8000n

C、T3(n)= n l o g 2 n n^{log_2n} nlog2n-6000n D、T4(n)=20000 l o g 2 n log_2n log2n

解析:D

T1(n)=O(nlog2n);T2(n)=O(n2);T3(n)=O( n l o g 2 n n^{log_2n} nlog2n);T4(n)=O(log2n)

4、求下列算法时间复杂度( )

int sum = 0;
for (int i = 1; i < n; i *= 2){
  	for(int j = 0; j < i; j++)
      	sum++;
}

A、logn B、n C、nlogn D、n2

解析:B

外循环为次数k=logn,内循环次数为1+2+4+…+2k ,构成等比数列q=2,次数为logn。[1-2(logn)]/1-2=n

5、以下不属于存储结构的是( )

A、栈 B、线索树 C、哈希表 D、双链表

解析:A

栈属于一种逻辑结构,通常有顺序栈和链栈两种存储结构。

6、数据采用链式存储结构时,要求( )

A、每个节点占用一片连续的存储区域 B、所有节点占用一片连续的存储区域

C、节点的最后一个数据域时指针类型 D、每个节点有多少个后继就设多少个指针域

解析:A

链式存储结构中所有节点的地址不一定是连续的,但每个节点必须占用一片连续的存储区域

7、计算机中算法指的是解决某一问题的有限运算序列,它必须具备输入、输出、( )

A、可行性、可移植性和可扩充性 B、可行性、有穷性和确定性

C、确定性、有穷性和稳定性 D、易读性、稳定性和确定性

解析:B

可移植性、可扩充性、稳定性和易读性都不是算法的特性。

8、求下列算法时间复杂度

void fun(int n){
  	int i, j ,k;
	for(i = 1; i <= n; i++)
      	for(j = 1; j <=n; j++){
          	k = 1;
      		while(k <= n) k = 5 * k;
      	}
}

解析:算法中的基本运算为k=5*k语句,当k=1时,while(k<=n) k=5*k,该语句的执行额度为log5n,再加上外层两重循环,所以本程序段的时间复杂度为O( n 2 l o g 5 n n^2{log_5n} n2log5n)

9、求下列算法时间复杂度

void fun(int n){
  	int s = 0, i, j, k;
  	for(i= 1; i <=n; i++)
  		for(j = 1; j <= i; j++){
          for(k =1; k <= j; k++){
            	s++;
          	}
  		}
}

解 析 : T ( n ) = ∑ i = 0 n ∑ j = 0 i ∑ k = 0 j − 1 1 = ∑ i = 0 n ∑ j = 0 i ( j − 1 − 0 + 1 ) = ∑ i = 0 n ∑ j = 0 i j 解析:T(n)=\sum_{i=0}^{n} \sum_{j=0}^{i} \sum_{k=0}^{j-1}1=\sum_{i=0}^{n} \sum_{j=0}^{i}(j-1-0+1) =\sum_{i=0}^{n} \sum_{j=0}^{i}j T(n)=i=0nj=0ik=0j11=i=0nj=0i(j10+1)=i=0nj=0ij

= ∑ i = 0 n i ( i + 1 ) 2 = 1 2 ( ∑ i = 0 n i 2 + ∑ i = 0 n i ) = 2 n 3 + 6 n 2 + 4 n 12 =\sum_{i=0}^{n} \frac{i(i+1)}{2}=\frac{1}{2}(\sum_{i=0}^{n}i^2+\sum_{i=0}^{n}i) =\frac{2n^3+6n^2+4n}{12} =i=0n2i(i+1)=21(i=0ni2+i=0ni)=122n3+6n2+4n

即 : T ( n ) = O ( n 3 ) 即:T(n)=O(n^3) T(n)=O(n3)

10、设线性表中有n个元素,以下操作中,( )在单链表上实现要比在顺序表上实现效率更高。

A、删除指定位置元素的后一个元素 B、在第一个元素的后面插入一个新元素

C、顺序输出前k个元素 D、交换第i个元素和第n-i+1个元素的值(i = 1,2,···,n)

解析:A、B

在顺序表中插入元素和删除元素时需要移动较多元素,而在单链表上执行同样的操作时不需要移动元素,只需要修改相关节点的指针域。

11、线性表的静态链表存储结构与顺序结构相比,优点是()

A、所有的操作算法实现简单 B、便于随机存取

C、便于插入和删除 D、便于利零散的存储器空间

解析:C

静态链表具有链表的插入和删除方便的优点,也不需要移动较多的元素。

12、线性表是()

A、一个有限序列,可以为空 B、一个有限序列,不可以为空

C、一个无限序列,可以为空 D、一个无线序列,不可以为空

解析:A

13、与单链表相比,双链表的优点之一是()

A、插入、删除 操作更简单 B、可以进行随机访问

C、可以省略表头指针或者表尾指针 D、访问前后相邻节点更方便

解析:D

在双链表中可以访问任意节点的相邻节点,而单链表中只能访问任一节点的下一节点。

13、如果最常用的操作是取第i个元素及其前驱元素,则采用()存储方式最节省时间。

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

解析:D

这里是查找第i-个元素和第i个元素,而顺序表具有随机存取的特点,查找速度快。

14、对于一个线性表,既要求能够较快地进行插入和删除操作,又要求存储结构能够反应数据元素之间的逻辑关系,则应采用()存储结构。

A、顺序 B、链式 C、散列 D、索引

解析:B

链式存储结构更方便于插入和删除操作。

15、以下关于单链表的叙述中,不正确的是()

A、节点除自身信息外还包括指针域,因此存储密度小于顺序存储结构

B、逻辑上相邻的元素物理上不必相邻

C、可以通过头节点直接计算第i个节点的存储地址

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

解析:C

单链表不具有随机存取特性,即不能在O(1)时间内找到第i个节点。

16、带头节点的单链表L为空的判定条件是()

A、L == NULL B、L->next == NULL C、L->next == L D、L != NULL

解析:B

在带头节点的单链表L中,L指向头节点,有头节点的next域指向第1个元素节点,L->next == NULL表示该单链表为空。

17、在长度为n的顺序表中删除一个元素的时间复杂度为()

A、O(1) B、O(logn) C、O(n) D、O(n2)

解析:C

在长度为n的顺序表中删除一个元素平均需要移动\frac{n-1}{2}个元素,对应的时间复杂度为O(n),该算法的主要时间花在移动元素上。

18、将两个各有n个元素的递增有序顺序表归并成一个有序顺序表,其最少的比较次数是()

A、n B、2n-1 C、2n D、n-1

解析:A

采用有序顺序表的归并算法,当L1表的所有元素均小于L2表的所有元素时比较的次数为n(元素小的顺序表的n个元素均与另一个顺序表的第一个元素比较一次),此时比较的次数最少。

19、将长度为n的单链表接在长度为m的单链表之后的算法的时间复杂度是()

A、O(1) B、O(n) C、O(m) D、O(m+n)

解析:C

在长度为n的单链表中找到尾节点,将长度为n的单链表的第一个数据节点作为其后继节点。

20、已知一个长度为n的单链表中所有节点是递增有序的,以下叙述中正确的是()

A、插入一个节点使之有序的算法的时间复杂度为O(1)

B、删除最大值节点使之有序的算法的时间复杂度为O(1)

C、找最小值节点的算法的时间复杂度为O(1)

D、以上都不对

解析:C

该递增有序单链表中第一个节点值最小,找到该节点的算法的时间复杂度为O(1)。

21、设线性表有n个元素,以下操作中,()在顺序表上实现比在链表上实现效率更高。

A、输入第i(1≤i≤n)个元素值

B、交换第1个元素与第2个元素的值

C、顺序输出这n个元素的值

D、输出与给定值x相等的元素在线性表中的序号

解析:A

由于顺序表具有随机存取功能,所以输出第i个元素时效率很高。

22、关于线性表的正确说法是()

A、每个元素都有一个前驱和一个后继元素

B、线性表中至少有一个元素

C、表中元素的排序顺序必须是由小到大或由大到小

D、除第一个元素和最后一个元素外,其余每个元素有且仅有一个前驱和一个后继元素

解析:D

线性表属于典型的线性结构。

23、要求线性表采用静态空间分配方式,且插入和删除操作时不需要移动元素,采用的存储结构是( )

A、单链表 B、静态链表 C、双链表 D、顺序表

解析:B

静态链表采用静态空间分配方式,且在插入和删除操作时不需要移动元素。

24、在单链表中设置头节点的作用?

解析:简化插入、删除节点的算法。

在带头节点的单链表中,头节点始终存在,且它的地址始终不变,这样在插入、删除首元素节点时十分方便。

25、在一个长度为n(n>1)的带头节点的单链表h上,另设有尾指针r(指向尾节点),执行( )操作与链表的长度有关。

A、删除单链表中的第一个元素 B、删除单链表中的尾节点

C、在单链表第一个元素前插入一个新节点 D、在单链表最后一个元素插入一个新节点

解析:B

选项B对应算法的时间复杂度为O(n),因为删除尾指针需要找到尾指针前一个节点;其他时间复杂度为O(1) 。

26、静态链表中指针域中存放的是( )

A、下一个元素的地址 B、内存地址

C、下一个元素在数组中的位置 D、以上都不对

解析:C

静态链表就是数组表,每个元素有一个指针域,其中存放的是下一个元素在数组中的下标(位置)。

27、在一个双链表中,删除*p节点之后的一个节点的操作是( )

A、p -> next=p -> next -> next; p ->next -> next -> prior=p;

B、p -> next -> prior=p; p -> next=p -> next -> next;

C、p -> next=p -> next -> next; p -> next -> prior=p;

D、p -> next -> next=p -> next; p -> next -> prior=p;

解析:C

img

28、在一个双链表中,在*p节点之后u插入节点 *q的操作是( )

A、q -> prior=p; p -> next=q; p -> next -> prior=q; q -> next=p -> next;

B、q -> next=p -> next ; p -> next -> prior=q; p -> next=q; q -> prior=p;

C、 p -> next=q; q -> prior=p; q -> next=p -> next ; p -> next -> prior=q;

D、p -> next -> prior=q; q -> next=p -> next; q -> prior=p; p -> next=q;

解析:B

img

29、将两个长度分别为n、m的递增有序顺序表归并成一个有序顺序表,其最少的比较次数是( )【MIN表示取最小值】

A、N B、m C、MIN(m,n) D、不确定

解析:C

采用有序顺序表的归并算法,比较的次数最少的情况是:其中一个较少的元素个数的顺序表的所有元素都小于另一个顺序表的所有元素,这样只需将前者的每个元素与后者的第一个元素都比较,总的比较次数为MIN(m,n)。

30、举例说明对相同的逻辑结构,同一种运算在不同的存储方式下实现,其运算效率不同。

线性表。可以采用顺序表和链表两种存储结构,对于查找序号为i的元素,在顺序表中实现时,算法的时间复杂度为O(1),在链表中实现时,算法的时间复杂度为O(n);

二叉树。采用顺序和链式(二叉链)两种存储结构,若已知某元素的地址,查找其双亲时,在顺序存储结构中实现时,算法的时间复杂度为O(1)(编号为i的元素的双亲编号为 i/2 ),在二叉链中实现时需要遍历树中节点,其算法的时间复杂度为O(n).

31、非空的循环单链表L的尾节点(有p所指向)满足( )

A、p -> next == NULL B、p == NULL C、p -> next == L D、p == L

解析:C

在非空的循环单链表L中,尾节点*p 的next 域指向头节点,即有p -> next ==L。

32、带头节点的双循环链表L为空表的条件是( )

A、 L == NULL B、L -> next -> prior == NULL C、L -> prior == NULL D、L -> next == L

解析:D

空双循环链表L的头节点的两个指针域均指向自己,即 L->next=L->prior=L

33、在一个双链表中,删除*p节点操作是( )

A. p -> prior -> next=p -> next ; p -> next-> prior=p -> prior;

B. p -> prior=p -> prior -> prior ; p -> prior -> prior=p;

C. p -> next -> prior=p ; p -> next=p -> next -> next;

D. p -> next=p -> prior -> prior ; p -> prior=p -> prior -> prior;

解析:A

img

34、在一个双链表中,在*p节点之前插入 *q节点的操作是( )

A. p -> prior=q; q -> next=p; p -> prior -> next=q; q -> prior=p -> prior ;

B. q -> prior=p -> prior; p -> prior -> next=q; q -> next=p; p -> prior=q -> next ;

C. q -> next=p; p -> next==q; q -> prior -> next=q; q -> next=p;

D. p -> prior -> next=q; q -> next=p; q -> prior=p -> prior; p -> prior=q;

解析:D

img

35、设有两个长度为n的单链表,节点类型相同,若以h1为头节点的单链表是非循环的,以h2为头节点指针的单链表是循环的,则( )

A、对于两个链表来说,删除第一个节点的操作,其时间复杂度都是O(1);

B、对于两个链表来说,删除尾节点的操作,其时间复杂度都是O(n);

C、循环链表要比非循环链表占用更多的内存空间;

D、h1和h2是不同类型的变量

解析:B

对于两个单链表来说,若要删除尾节点,都需要从头节点开始找到最后节点的前驱节点,其时间复杂度都是O(n)

36、某线性表最常用的操作是在尾元素之后插入一个元素和删除第一个元素,故采用( )存储方式最节省运算时间。

A、单链表 B、仅有头节点指针的循环单链表

C、双链表 D、仅有尾节点指针的循环单链表

解析:D

D选项中时间复杂度均为O(1)

37、在非空循环双链表的*p节点之前插入 *q节点的操作是( )

A.p -> prior=q; q -> next=p; p -> prior -> next=q; q -> prio=p -> prior;

B.p -> prior=q; p -> prior -> next=q; q -> next=p; q -> prior=p -> prior;

C.q -> next=p; q -> prior=p -> prior; p -> prior=q; p -> prior -> next=q;

D.q -> next=p; q -> prior=p -> prior; p -> prior -> next = q; p -> prior=q;

解析:D

双链表中插入相同

38、某线性表最常用的操作是在尾元素之后插入一个元素和删除尾元素,则采用( )存储方式最节省运算时间。

A、单链表 B、循环单链表 C、双链表 D、循环双链表

解析:D

在链表中插入或删除一个节点,只需要修改相邻节点的指针域。循环双链表可以方便找到最后一个节点及前驱节点,本题中两个操作对应的时间复杂度均为O(1)

39、若元素a、b、c、d、e、f依次进栈、退栈的操作交替进行,但不允许连续3次退栈工作,则不可能得到的出栈序列是( )

A、dcebfa B、cbdaef C、bcaefd D、afedcb

解析:D

选项A操作: a进,b进,c进,d进,d出,c出,e进,e出,b出,f进,f出,a出。

选项B操作: a进,b进,c进,c出, b出,d进,d出,a出, e进,e出,f进,f出。

选项C操作: a进,b进,b出,c进,c出,a出,d进, e进,e出,f进,f出,d出。

选项D操作: a进,a出,b进,c进,d进,e进,f进, f出,e出,d出,c出,b出。

从中看到,选项D中最后连续出栈5次,不符合要求。

40、已知一个栈的进栈序列是ABC,出栈序列为CBA,经过的栈操作是( )

A、push, pop, push, pop, push, pop B、push, push, push, pop, pop, pop

C、push, push, pop, pop, push, pop D、push, pop, push, push, pop, pop

解析:B

41、元素A、B、C、D依次进栈后,栈顶元素是( ) ,栈底元素是( )

A、A B、B C、C D、D

解析:D、A

元素A、B、C、D依次进栈,此时从栈顶到栈底一次为D、C、B、A,栈顶元素是D,栈底元素是A

42、在长度为n的( )上,删除第一个元素,其算法的时间复杂度为O(n)

A、只有表头指针的不带表头节点的循环单链表

B、只有表尾指针的不带表头节点的循环单链表

C、只有表尾指针的带表头节点的循环单链表

D、只有表头指针的带表头节点的循环单链表

解析:A

A选项的单链表如图所示,在删除第一个节点后要求仍为循环单链表,所以要找到尾节点img

void delfirst(LinkList *h)
{
  LinkList *p = h;
  while(p->next!=h)
    p=p->next;
  p->next=h->next;
  free(h);
  h=p->next;
}

43、设有5个元素的进栈序列是a,b,c,d,e,其输出序列是c,e,d,b,a,则该栈的容量至少是( )

A、1 B、2 C、3 D、4

解析:D

进栈序列是a,b,c,d,e,输出序列是c,e,d,b,a的操作是:a进、b进、c进、d进、e进、e出、d出、b出、a出。从中看到,栈中的最多元素为4个。

44、在数据处理过程中长需要保存一些中间数据,如果后保存的数据先处理,则使用( )来保存这些数据。

A、线性表 B、栈 C、队列 D、单链表

解析:B

由于后保存的数据先处理,栈正好满足这个特点

45、已知一个栈的进栈序列是1,2,3,····,n,其输出序列的第一个元素是 i(1≤i≤n),则第j(1≤j≤n)个出栈元素是( )

A、i B、n-i C、j-i+1 D、不确定

解析:D

根据栈的特点,输出序列的第一个元素是 i,无法确定第 j个出栈的元素

46、设一个栈的输入序列为A、B、C、D,则借助一个栈所得到的输出序列不可能是( )

A、A,B,C,D B、D,C,B,A C、A,C,D,B D、D,A,B,C

解析:D

可以简单地推算,容易得出D,A,B,C是不可能的,因为D先出来,说明A,B,C,D均在栈中,在栈中顺序应为D,C,B,A,出栈的顺序只能是D,C,B,A

47、判定一个顺序栈st为(元素个数最多为MaxSize)空的条件为( )

A、st.top==-1 B、st.top!=-1 C、st.top!=MaxSize D、st.top == MaxSize

解析:A

通常情况下,将st.top=0的一端作为栈底,栈空是指栈不存在元素,应满足st.top == -1

48、设有一个数列的输入顺序为123456,若采用栈结构,并以S和X分别表示进栈和出栈操作,试求通过进栈和出栈操作的合法序列。

(1)能否得到输出顺序为325641的序列?

能得到输出序列为325641的序列,其操作序列为:SSSXXSSXSXXX

(2)能否得到输出顺序为154623的序列?

不能得到输出顺序为154623的序列;执行SXSSSSXXSX,得到输出序列1546后,栈中元素从栈顶到栈底为32,不能让2先出栈,所以得不到输出序列154623

49、有n个元素,他们的编号为1~n,顺序的进入一个栈,则可能的出栈序列有( )种。

解析: 1 n + 1 C 2 n n \frac{1}{n+1}C_{2n}^{n} n+11C2nn

一下三类问题是等价的:

(1)n个不相同元素进栈的出栈序列个数;

(2)由n个不相同元素构成不同形态的二叉树个数

(3)n个不相同元素的先序序列构成不同形态的二叉树个数

50、设n个元素进栈序列是p1、p2、pj、····、pn,其输出序列是1、2、3、····、n,若p3=3,则p1的值( )

A、可能是2 B、一定是2 C、不可能是1 D、一定是1

解析:A

当p3=3时,进栈序列是p1、p2、3、···,由输出序列可知,只有以下两种情况。

(1)p1进栈后出栈,p2进栈后出栈,即p1=1, p2=2, p3进栈后出栈,这种情况下p1=1

(2)p1、p2都进栈后都出栈,即p2=1,p1=2,p3进栈后出栈,这种情况下p1=2.

由上面两种情况得p1可能为1或者2推出A选项。

51、若一个栈用数组data[1…n]存储,初始栈顶指针top为1,则以下元素x进栈的正确操作是( )

A、top++; data[top]=x; B、data[top]=x; top++;

C、top–; data[top]=x; D、data[top]-x; top–;

解析:B

初始栈顶指针top为1,说明data[1]端作为栈底,在进栈时top应递增,由于存在data[1]的元素,所以在进栈时应先将x放在top处,再将top递增。

52、若一个栈用数组data[]1····n]存储,初始栈顶指针top为n+1,则以下元素x进栈的正确操作是( )

A、top++; data[top]=x; B、data[top]=x; top++;

C、top–; data[top]=x; D、data[top]=x; top–;

解析:C

初始栈顶指针top为n+1,说明data[n]端作为栈底,在进栈时top应递减,由于不存在data[b+1]的元素,所以在进栈时应先将top递减,再将x放在top处。

53、表达式a*(b+c)-d的后缀表达式是( )

A、a b c d * + - Bs、a b c + * d -

C、a b c * + d - D、- + * a b c d

解析:B

根据式子画出树,后缀表达式等价于求树的后序遍历

img

54、判定一个顺序栈st(元素个数最多为MaxSize)为栈满的条件是( )

A、st.top != -1 B、st.top == -1

C、st.top != MaxSize-1 D、st.top==MaxSize-1

解析:D

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值