1. 程式人生 > 其它 >資料結構之KH [前四章] -->選擇題 (一)

資料結構之KH [前四章] -->選擇題 (一)

技術標籤:資料結構

包括 緒論 線性表 棧 佇列 串 陣列 廣義表


一.緒論選擇題

(1)在資料結構中,從邏輯上可以把資料結構分成(C )。
A.動態結構和靜態結構 B.緊湊結構和非緊湊結構
C.線性結構和非線性結構 D.內部結構和外部結構


(2)與資料元素本身的形式、內容、相對位置、個數無關的是資料的(C )。
A.儲存結構 B.儲存實現
C.邏輯結構 D.運算實現


(3)通常要求同一邏輯結構中的所有資料元素具有相同的特性,這意味著(B )。
A.資料具有同一特點
B.不僅資料元素所包含的資料項的個數要相同,而且對應資料項的型別要一致
C.每個資料元素都一樣
D.資料元素所包含的資料項的個數要相等


(4)以下說法正確的是( D)。
A.資料元素是資料的最小單位
B.資料項是資料的基本單位
C.資料結構是帶有結構的各資料項的集合
D.一些表面上很不相同的資料可以有相同的邏輯結構

解釋:資料元素是資料的基本單位,資料項是資料的最小單位,資料結構是帶有結構的各資料元素的集合。


解釋:資料元素是資料的基本單位,資料項是資料的最小單位,資料結構是帶有結構的各資料元素的集合。
(5)演算法的時間複雜度取決於(D)。
A.問題的規模 B.待處理資料的初態
C.計算機的配置 D.A和B

解釋:演算法的時間複雜度不僅與問題的規模有關,還與問題的其他因素有關。如某些排序的演算法,其執行時間與待排序記錄的初始狀態有關。為此,有時會對演算法有最好、最壞以及平均時間複雜度的評價。


(6)以下資料結構中,(A)是非線性資料結構
A.樹 B.字串 C.佇列 D.棧


二.線性表選擇題

1.選擇題
(1)順序表中第一個元素的儲存地址是100,每個元素的長度為2,則第5個元素的地址是( B)。
A.110 B.108 C.100 D.120

解釋:順序表中的資料連續儲存,所以第5個元素的地址為:100+2*4=108。


(2)在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個結點從小到大排序

解釋:在順序表中插入一個結點的時間複雜度都是O(n2

),排序的時間複雜度為O(n2)或O(nlog2n)。順序表是一種隨機存取結構,訪問第i個結點和求第i個結點的直接前驅都可以直接通過陣列的下標直接定位,時間複雜度是O(1)。


(3) 向一個有127個元素的順序表中插入一個新元素並保持原來順序不變,平均要移動 的元素個數為( B)。
A.8 B.63.5 C.63 D.7

解釋:平均要移動的元素個數為:n/2。


(4)連結儲存的儲存結構所佔儲存空間(A)。
A.分兩部分,一部分存放結點值,另一部分存放表示結點間關係的指標
B.只有一部分,存放結點值
C.只有一部分,儲存表示結點間關係的指標
D.分兩部分,一部分存放結點值,另一部分存放結點所佔單元數


(5)線性表若採用鏈式儲存結構時,要求記憶體中可用儲存單元的地址( D)。
A.必須是連續的 B.部分地址必須是連續的
C.一定是不連續的 D.連續或不連續都可以


(6)線性表L在( B)情況下適用於使用鏈式結構實現。
A.需經常修改L中的結點值 B.需不斷對L進行刪除插入
C.L中含有大量的結點 D.L中結點結構複雜

解釋:連結串列最大的優點在於插入和刪除時不需要移動資料,直接修改指標即可。


(7)單鏈表的儲存密度(C)。
A.大於1 B.等於1 C.小於1 D.不能確定

解釋:儲存密度是指一個結點資料本身所佔的儲存空間和整個結點所佔的儲存空間之比,假設單鏈表一個結點本身所佔的空間為D,指標域所佔的空間為N,則儲存密度為:D/(D+N),一定小於1。


(8)將兩個各有n個元素的有序表歸併成一個有序表,其最少的比較次數是(A)。
A.n B.2n-1 C.2n D.n-1

解釋:當第一個有序表中所有的元素都小於(或大於)第二個表中的元素,只需要用第二個表中的第一個元素依次與第一個表的元素比較,總計比較n次。


(9)在一個長度為n的順序表中,在第i個元素(1≤i≤n+1)之前插入一個新元素時須向後移動(B)個元素。
A.n-i B.n-i+1 C.n-i-1 D.I


(10) 線性表L=(a1,a2,……an),下列說法正確的是( D)。
A.每個元素都有一個直接前驅和一個直接後繼
B.線性表中至少有一個元素
C.表中諸元素的排列必須是由小到大或由大到小
D.除第一個和最後一個元素外,其餘每個元素都有一個且僅有一個直接前驅和直接後繼。


(11) 建立一個包括n個結點的有序單鏈表的時間複雜度是( C )。
A.O(1) B.O(n) C.O(n2) D.O(nlog2n)

解釋:單鏈表建立的時間複雜度是O(n),而要建立一個有序的單鏈表,則每生成一個新結點時需要和已有的結點進行比較,確定合適的插入位置,所以時間複雜度是O(n2)。


(12) 以下說法錯誤的是(D )。
A.求表長、定位這兩種運算在採用順序儲存結構時實現的效率不比採用鏈式儲存結構時實現的效率低
B.順序儲存的線性表可以隨機存取
C.由於順序儲存要求連續的儲存區域,所以在儲存管理上不夠靈活
D.== 線性表的鏈式儲存結構優於順序儲存結構==

解釋:鏈式儲存結構和順序儲存結構各有優缺點,有不同的適用場合。


(13) 在單鏈表中,要將s所指結點插入到p所指結點之後,其語句應為(D)。
A.s->next=p+1; p->next=s;
B.(*p).next=s; (*s).next=(*p).next;
C.s->next=p->next; p->next=s->next;
D.s->next=p->next; p->next=s;


(14) 在雙向連結串列儲存結構中,刪除p所指的結點時須修改指標(A)。
A.p->next->prior=p->prior; p->prior->next=p->next;
B.p->next=p->next->next; p->next->prior=p;
C.p->prior->next=p; p->prior=p->prior->prior;
D.p->prior=p->next->next; p->next=p->prior->prior;


(15) 在雙向迴圈連結串列中,在p指標所指的結點後插入q所指向的新結點,其修改指標的操作是(C)。
A.p->next=q; q->prior=p; p->next->prior=q; q->next=q;
B.p->next=q; p->next->prior=q; q->prior=p; q->next=p->next;
C.q->prior=p; q->next=p->next; p->next->prior=q; p->next=q;
D.q->prior=p; q->next=p->next; p->next=q; p->next->prior=q;


三.棧和佇列選擇題

1.選擇題
(1)若讓元素1,2,3,4,5依次進棧,則出棧次序不可能出現在( C )種情況。
A.5,4,3,2,1
B.2,1,5,4,3
C.4,3,1,2,5
D.2,3,5,4,1

解釋:棧是後進先出的線性表,不難發現C選項中元素1比元素2先出棧,違背了棧的後進先出原則,所以不可能出現C選項所示的情況。


(2)若已知一個棧的入棧序列是1,2,3,…,n,其輸出序列為p1,p2,p3,…,pn,若p1=n,則pi為(C)。
A.i B.n-i C.n-i+1 D.不確定

解釋:棧是後進先出的線性表,一個棧的入棧序列是1,2,3,…,n,而輸出序列的第一個元素為n,說明1,2,3,…,n一次性全部進棧,再進行輸出,所以p1=n,p2=n-1,…,pi=n-i+1。


(3)陣列Q[n]用來表示一個迴圈佇列,f為當前佇列頭元素的前一位置,r為隊尾元素的位置,假定佇列中元素的個數小於n,計算佇列中元素個數的公式為(D )。
A.r-f B.(n+f-r)%n C.n+r-f D.(n+r-f)%n

解釋:對於非迴圈佇列,尾指標和頭指標的差值便是佇列的長度,而對於迴圈佇列,差值可能為負數,所以需要將差值加上MAXSIZE(本題為n),然後與MAXSIZE(本題為n)求餘,即(n+r-f)%n。


(4)鏈式棧結點為:(data,link),top指向棧頂.若想摘除棧頂結點,並將刪除結點的值儲存到x中,則應執行操作(A)。
A.x=top->data;top=top->link; B.top=top->link=;x=top->link;
C.x=top;top=top->link; D.x=top->link;

解釋:x=top->data將結點的值儲存到x中,top=top->link棧頂指標指向棧頂下一結點,即摘除棧頂結點。


(5)設有一個遞迴演算法如下
int fact(int n) { //n大於等於0
if(n<=0) return 1;
else return n*fact(n-1); }
則計算fact(n)需要呼叫該函式的次數為(A)。
A. n+1 B. n-1 C. n D. n+2

解釋:特殊值法。設n=0,易知僅呼叫一次fact(n)函式,故選A。


(6)棧在 (D )中有所應用。
A.遞迴呼叫 B.函式呼叫 C.表示式求值 D.前三個選項都有

解釋:遞迴呼叫、函式呼叫、表示式求值均用到了棧的後進先出性質。


(7)為解決計算機主機與印表機間速度不匹配問題,通常設一個列印資料緩衝區。主機將要輸出的資料依次寫入該緩衝區,而印表機則依次從該緩衝區中取出資料。該緩衝區的邏輯結構應該是( A)。
A.佇列 B.棧 C. 線性表 D.有序表

解釋:解決緩衝區問題應利用一種先進先出的線性表,而佇列正是一種先進先出的線性表。


(8)設棧S和佇列Q的初始狀態為空,元素e1、e2、e3、e4、e5和e6依次進入棧S,一個元素出棧後即進入Q,若6個元素出隊的序列是e2、e4、e3、e6、e5和e1,則棧S的容量至少應該是(B)。

A.2 B.3 C.4 D. 6

解釋:元素出隊的序列是e2、e4、e3、e6、e5和e1,可知元素入隊的序列是e2、e4、e3、e6、e5和e1,即元素出棧的序列也是e2、e4、e3、e6、e5和e1,而元素e1、e2、e3、e4、e5和e6依次進入棧,易知棧S中最多同時存在3個元素,故棧S的容量至少為3。


(9)若一個棧以向量V[1…n]儲存,初始棧頂指標top設為n+1,則元素x進棧的正確操作是( ==C ==)。
A.top++; V[top]=x; B.V[top]=x; top++;
C.top–; V[top]=x; D.V[top]=x; top–;

解釋:初始棧頂指標top為n+1,說明元素從陣列向量的高階地址進棧,又因為元素儲存在向量空間V[1…n]中,所以進棧時top指標先下移變為n,之後將元素x儲存在V[n]。


(10)設計一個判別表示式中左,右括號是否配對出現的演算法,採用(D)資料結構最佳。
A.線性表的順序儲存結構 B.佇列
C. 線性表的鏈式儲存結構 D. 棧

解釋:利用棧的後進先出原則。


(11)用連結方式儲存的佇列,在進行刪除運算時(D)。
A. 僅修改頭指標 B. 僅修改尾指標
C. 頭、尾指標都要修改 D. 頭、尾指標可能都要修改

解釋:一般情況下只修改頭指標,但是,當刪除的是佇列中最後一個元素時,隊尾指標也丟失了,因此需對隊尾指標重新賦值。


(12)迴圈佇列儲存在陣列A[0…m]中,則入隊時的操作為(D)。
A. rear=rear+1 B. rear=(rear+1)%(m-1)
C. rear=(rear+1)%m D. rear=(rear+1)%(m+1)

解釋:陣列A[0…m]中共含有m+1個元素,故在求模運算時應除以m+1。


(13)最大容量為n的迴圈佇列,隊尾指標是rear,隊頭是front,則隊空的條件是(B)。
A. (rear+1)%n = =front B. rear= =front
C.rear+1= =front D. (rear-l)%n= =front

解釋:最大容量為n的迴圈佇列,隊滿條件是(rear+1)%n= =front,隊空條件是rear= =front。


(14)棧和佇列的共同點是(C)。
A. 都是先進先出 B. 都是先進後出
C. 只允許在端點處插入和刪除元素 D. 沒有共同點

解釋:棧只允許在棧頂處進行插入和刪除元素,佇列只允許在隊尾插入元素和在隊頭刪除元素。


(15)一個遞迴演算法必須包括(B)。
A. 遞迴部分 B. 終止條件和遞迴部分
C. 迭代部分 D. 終止條件和迭代部分


四. 串、陣列和廣義表

(1)串是一種特殊的線性表,其特殊性體現在( B)。
A.可以順序儲存 B.資料元素是一個字元
C.可以鏈式儲存 D.資料元素可以是多個字元若


(2)串下面關於串的的敘述中,(B)是不正確的?
A.串是字元的有限序列
B.空串是由空格構成的串
C.模式匹配是串的一種重要運算
D.串既可以採用順序儲存,也可以採用鏈式儲存

解釋:空格常常是串的字元集合中的一個元素,有一個或多個空格組成的串成為空格串,零個字元的串成為空串,其長度為零。


敲黑板

(3)串“ababaaababaa”的next陣列為(C)。
A.012345678999 B.012121111212 C.011234223456 D.0123012322345

計算字串的next函式值,可以參考"KMP模式匹配演算法".

計算過程:

下標 j123456789101112
字串ababaaababaa
next [j]011234223456
  1. 當 j=1時,固定就是next[1]=0;
  2. 當 j=2時,由1到j-1的字串是"a",屬於其他情況,固定就是next[2]=1;
  3. 當 j=3時,由1到j-1的字串是"ab",字首字元"a"與字尾字元"b"不相等,
    屬於其他情況,所以,next[3]=1;
  4. 當 j=4時,由1到j-1的字串是"aba",字首字元"a"與字尾字元"a"相等,
    也就是有1個字元相等,所以,next[4]=1+1=2;
  5. 當 j=5時,由1到j-1的字串是"abab",字首字元"ab"與字尾字元"ab"相等,
    也就是有2個字元相等,所以,next[5]=2+1=3;
  6. 當 j=6時,由1到j-1的字串是"ababa",字首字元"aba"與字尾字元"aba"相等,
    也就是有3個字元相等,所以,next[6]=3+1=4;
  7. 當 j=7時,由1到j-1的字串是"ababaa",字首字元"a"與字尾字元"a"相等,
    也就是有1個字元相等,所以,next[7]=1+1=2;
  8. 當 j=8時,由1到j-1的字串是"ababaaa",字首字元"a"與字尾字元"a"相等,
    也就是有1個字元相等,所以,next[8]=1+1=2;
  9. 當 j=9時,由1到j-1的字串是"ababaaab",字首字元"ab"與字尾字元"ab"相等,
    也就是有2個字元相等,所以,next[9]=2+1=3;
  10. 當 j=10時,由1到j-1的字串是"ababaaaba",字首字元"aba"與字尾字元"aba"相等,
    也就是有3個字元相等,所以,next[10]=3+1=4;
  11. 當 j=11時,由1到j-1的字串是"ababaaabab",字首字元"abab"與字尾字元"abab"相等,
    也就是有4個字元相等,所以,next[11]=4+1=5;
  12. 當 j=12時,由1到j-1的字串是"ababaaababa",字首字元"ababa"與字尾字元"ababa"相等,
    也就是有5個字元相等,所以,next[12]=5+1=6;

所以,答案選 C.011234223456


(4)串“ababaabab”的nextval為( A )。
A.010104101 B.010102101 C.010100011 D.010101011

知識點:

nextval[i]的求解需要
s中next[i]所在位置的字元 == s[i]的字元一致,
如果一致
	 則用s[next[i]]的nextval的值作為nextval[i],
如果不一致,
	 則用next[i]做為nextval[i]。
下標 j123456789
字串ababaabab
next[i]011234234
nextval[i]010104101

(5)串的長度是指(B)。
A.串中所含不同字母的個數 B.串中所含字元的個數
C.串中所含不同字元的個數 D.串中所含非空格字元的個數

解釋:串中字元的數目稱為串的長度。


(6)假設以行序為主序儲存二維陣列A=array[1…100,1…100],設每個資料元素佔2個儲存單元,基地址為10,則LOC[5,5]=(B)。
A.808 B.818 C.1010 D.1020

解釋:以行序為主,則LOC[5,5]=[(5-1)*100+(5-1)]*2+10=818。

Loc(Aij)=10(基地址)+[(5-1)*100+(5-1)]*2=818。


(7)設有陣列A[i,j],陣列的每個元素長度為3位元組,i的值為1到8,j的值為1到10,陣列從記憶體首地址BA開始順序存放,當用以列為主存放時,元素A[5,8]的儲存首地址為(B )。
A.BA+141 B.BA+180 C.BA+222 D.BA+225

解釋:以列序為主,則LOC[5,8]=[(8-1)*8+(5-1)]*3+BA=BA+180。


(8)設有一個10階的對稱矩陣A,採用壓縮儲存方式,以行序為主儲存,a1,1為第一元素,其儲存地址為1,每個元素佔一個地址空間,則a8,5的地址為( C)。
A.13 B.32 C.33 D.40

解釋:這裡陣列下標從1開始,只儲存其下三角形元素,在a8,5的前面有7行,第1行有1個元素,第2行有2個元素,…,第7行有7個元素,這7行共有(1+7)×7/2=28個元素,在第8行中,a8,5的前面有4個元素,所以,a8,5前有28+4=32個元素,其地址為33。


(9)若對n階對稱矩陣A以行序為主序方式將其下三角形的元素(包括主對角線上所有元素)依次存放於一維陣列B[1…(n(n+1))/2]中,則在B中確定aij(i<j)的位置k的關係為(B)。
A.i*(i-1)/2+j B.j*(j-1)/2+i C.i*(i+1)/2+j D.j*(j+1)/2+i


(10)二維陣列A的每個元素是由10個字元組成的串,其行下標i=0,1,…,8,列下標j=1,2,…,10。若A按行先儲存,元素A[8,5]的起始地址與當A按列先儲存時的元素(B )的起始地址相同。設每個字元佔一個位元組。
A.A[8,5] B.A[3,10] C. A[5,8] D.A[0,9]

8×10+5-1=(j-1)×9+i

解釋:設陣列從記憶體首地址M開始順序存放,若陣列按行先儲存,元素A[8,5]的起始地址為:M+[(8-0)*10+(5-1)]*1=M+84;若陣列按列先儲存,易計算出元素A[3,10]的起始地址為:M+[(10-1)*9+(3-0)]*1=M+84。故選B。


(11)設二維陣列A[1… m,1… n](即m行n列)按行儲存在陣列B[1… m*n]中,則二維陣列元素A[i,j]在一維陣列B中的下標為(A)。
A.(i-1)n+j B.(i-1)n+j-1 C.i(j-1) D.jm+i-1

解釋:特殊值法。取i=j=1,易知A[1,1]的的下標為1,四個選項中僅有A選項能確定的值為1,故選A。


(12)陣列A[0…4,-1…-3,5…7]中含有元素的個數(B)。
A.55 B.45 C.36 D.16

答案:B
解釋:共有533=45個元素。


(13)廣義表A=(a,b,(c,d),(e,(f,g))),則Head(Tail(Head(Tail(Tail(A)))))的值為(D)。
A.(g) B.(d) C.c D.d

解釋:Tail(A)=(b,(c,d),(e,(f,g)));Tail(Tail(A))=( (c,d),(e,(f,g))); Head(Tail(Tail(A)))= (c,d);Tail(Head(Tail(Tail(A))))=(d);Head(Tail(Head(Tail(Tail(A)))))=d。


(14)廣義表((a,b,c,d))的表頭是(C),表尾是(B )。
A.a B.( ) C.(a,b,c,d) D.(b,c,d)

解釋:表頭為非空廣義表的第一個元素,可以是一個單原子,也可以是一個子表,((a,b,c,d))的表頭為一個子表(a,b,c,d);== 表尾為除去表頭之外,由其餘元素構成的表 ==,表為一定是個廣義表,((a,b,c,d))的表尾為空表( )。


(15)設廣義表L=((a,b,c)),則L的長度和深度分別為(C)。
A.1和1 B.1和3 C.1和2 D.2和3

解釋:廣義表的深度是指廣義表中展開後所含括號的層數,廣義表的長度是指廣義表中所含元素的個數。根據定義易知L的長度為1,深度為2。