版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
word文檔精品文檔分享數(shù)據(jù)構(gòu)造〔C語言版〕〔第2版〕課后習(xí)題答案李冬梅2021.3word文檔精品文檔分享目錄第1章緒論1第2章線性表5第3章棧和隊(duì)列14第4章串、數(shù)組和廣義表27第5章樹和二叉樹34第6章圖44第7章查找55第8章排序66word文檔精品文檔分享IIword文檔精品文檔分享第1章緒論1.簡(jiǎn)述以下概念:數(shù)據(jù)、數(shù)據(jù)元素、數(shù)據(jù)項(xiàng)、數(shù)據(jù)對(duì)象、數(shù)據(jù)構(gòu)造、邏輯構(gòu)造、存儲(chǔ)結(jié)構(gòu)、抽象數(shù)據(jù)類型。答案:數(shù)據(jù):是客觀事物的符號(hào)表示,指所有能輸入到計(jì)算機(jī)中并被計(jì)算機(jī)程序處理的符號(hào)的總稱。如數(shù)學(xué)計(jì)算中用到的整數(shù)和實(shí)數(shù),文本編輯所用到的字符串,多媒體程序處理的圖形、圖像、聲音、動(dòng)畫等通過特殊編碼定義后的數(shù)據(jù)。數(shù)據(jù)元素:是數(shù)據(jù)的根本單位,在計(jì)算機(jī)中通常作為一個(gè)整體進(jìn)展考慮和處理。在有些情況下,數(shù)據(jù)元素也稱為元素、結(jié)點(diǎn)、記錄等。數(shù)據(jù)元素用于完整地描述一個(gè)對(duì)象,如一個(gè)學(xué)生記錄,樹中棋盤的一個(gè)格局〔狀態(tài)〕、圖中的一個(gè)頂點(diǎn)等。數(shù)據(jù)項(xiàng):是組成數(shù)據(jù)元素的、有獨(dú)立含義的、不可分割的最小單位。例如,學(xué)生根本信息表中的學(xué)號(hào)、XX、性別等都是數(shù)據(jù)項(xiàng)。數(shù)據(jù)對(duì)象:是性質(zhì)一樣的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個(gè)子集。例如:整數(shù)數(shù)據(jù)對(duì)象是集合 N={0,±1,±2,?},字母字符數(shù)據(jù)對(duì)象是集合C={‘A’,‘ B’,?,‘Z’,‘a(chǎn)’,‘b’,?,‘z’},學(xué)生根本信息表也可是一個(gè)數(shù)據(jù)對(duì)象。數(shù)據(jù)構(gòu)造:是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。換句話說,數(shù)據(jù)結(jié)構(gòu)是帶“構(gòu)造〞的數(shù)據(jù)元素的集合,“構(gòu)造〞就是指數(shù)據(jù)元素之間存在的關(guān)系。邏輯構(gòu)造:從邏輯關(guān)系上描述數(shù)據(jù),它與數(shù)據(jù)的存儲(chǔ)無關(guān),是獨(dú)立于計(jì)算機(jī)的。因此,數(shù)據(jù)的邏輯構(gòu)造可以看作是從具體問題抽象出來的數(shù)學(xué)模型。存儲(chǔ)構(gòu)造:數(shù)據(jù)對(duì)象在計(jì)算機(jī)中的存儲(chǔ)表示,也稱為物理構(gòu)造。抽象數(shù)據(jù)類型:由用戶定義的,表示應(yīng)用問題的數(shù)學(xué)模型,以及定義在這個(gè)模型上的一組操作的總稱。具體包括三局部:數(shù)據(jù)對(duì)象、數(shù)據(jù)對(duì)象上關(guān)系的集合和對(duì)數(shù)據(jù)對(duì)象的根本操作的集合。2.試舉一個(gè)數(shù)據(jù)構(gòu)造的例子,表達(dá)其邏輯構(gòu)造和存儲(chǔ)構(gòu)造兩方面的含義和相互關(guān)系。答案:例如有一X學(xué)生根本信息表,包括學(xué)生的學(xué)號(hào)、XX、性別、籍貫、專業(yè)等。每個(gè)學(xué)生根本信息記錄對(duì)應(yīng)一個(gè)數(shù)據(jù)元素,學(xué)生記錄按順序號(hào)排列,形成了學(xué)生根本信息記錄的線性序列。對(duì)于整個(gè)表來說,只有一個(gè)開場(chǎng)結(jié)點(diǎn)(它的前面無記錄)和一個(gè)終端結(jié)點(diǎn)(它的后面無記錄),其他的結(jié)點(diǎn)那么各有一個(gè)也只有一個(gè)直接前趨和直接后繼。學(xué)生記錄之間的這種關(guān)系就確定了學(xué)生表的邏輯構(gòu)造,即線性構(gòu)造。這些學(xué)生記錄在計(jì)算機(jī)中的存儲(chǔ)表示就是存儲(chǔ)構(gòu)造。如果用連續(xù)的存儲(chǔ)單元(如用數(shù)組表)來存放這些記錄,那么稱為順序存儲(chǔ)構(gòu)造;如果存儲(chǔ)單元不連續(xù),而是隨機(jī)存放各個(gè)記錄,然后用指針進(jìn)展,那么稱為鏈?zhǔn)酱鎯?chǔ)構(gòu)造。即一樣的邏輯構(gòu)造,可以對(duì)應(yīng)不同的存儲(chǔ)構(gòu)造。3.簡(jiǎn)述邏輯構(gòu)造的四種根本關(guān)系并畫出它們的關(guān)系圖。word文檔精品文檔分享1word文檔精品文檔分享答案:〔1〕集合構(gòu)造數(shù)據(jù)元素之間除了“屬于同一集合〞的關(guān)系外,別無其他關(guān)系。例如,確定一名學(xué)生是否為班級(jí)成員,只需將班級(jí)看做一個(gè)集合構(gòu)造。〔2〕線性構(gòu)造數(shù)據(jù)元素之間存在一對(duì)一的關(guān)系。例如,將學(xué)生信息數(shù)據(jù)按照其入學(xué)報(bào)到的時(shí)間先后順序進(jìn)展排列,將組成一個(gè)線性構(gòu)造。〔3〕樹構(gòu)造數(shù)據(jù)元素之間存在一對(duì)多的關(guān)系。例如,在班級(jí)的管理體系中,班長(zhǎng)管理多個(gè)組長(zhǎng),每位組長(zhǎng)管理多名組員,從而構(gòu)成樹形構(gòu)造?!?〕圖構(gòu)造或網(wǎng)狀構(gòu)造數(shù)據(jù)元素之間存在多對(duì)多的關(guān)系。例如,多位同學(xué)之間的朋友關(guān)系,任何兩位同學(xué)都可以是朋友,從而構(gòu)成圖形構(gòu)造或網(wǎng)狀構(gòu)造。其中樹構(gòu)造和圖構(gòu)造都屬于非線性構(gòu)造。四類根本邏輯構(gòu)造關(guān)系圖4.存儲(chǔ)構(gòu)造由哪兩種根本的存儲(chǔ)方法實(shí)現(xiàn)?答案:〔1〕順序存儲(chǔ)構(gòu)造順序存儲(chǔ)構(gòu)造是借助元素在存儲(chǔ)器中的相對(duì)位置來表示數(shù)據(jù)元素之間的邏輯關(guān)系,通常借助程序設(shè)計(jì)語言的數(shù)組類型來描述。〔2〕鏈?zhǔn)酱鎯?chǔ)構(gòu)造順序存儲(chǔ)構(gòu)造要求所有的元素依次存放在一片連續(xù)的存儲(chǔ)空間中,而鏈?zhǔn)酱鎯?chǔ)構(gòu)造,無需占用一整塊存儲(chǔ)空間。但為了表示結(jié)點(diǎn)之間的關(guān)系,需要給每個(gè)結(jié)點(diǎn)附加指針字段,用于存放后繼元素的存儲(chǔ)地址。所以鏈?zhǔn)酱鎯?chǔ)構(gòu)造通常借助于程序設(shè)計(jì)語言的指針類型來描述。5.選擇題〔1〕在數(shù)據(jù)構(gòu)造中,從邏輯上可以把數(shù)據(jù)構(gòu)造分成〔〕。A.動(dòng)態(tài)構(gòu)造和靜態(tài)構(gòu)造B.緊湊構(gòu)造和非緊湊構(gòu)造word文檔精品文檔分享2word文檔精品文檔分享C.線性構(gòu)造和非線性構(gòu)造D.內(nèi)部構(gòu)造和外部構(gòu)造答案:C〔2〕與數(shù)據(jù)元素本身的形式、內(nèi)容、相對(duì)位置、個(gè)數(shù)無關(guān)的是數(shù)據(jù)的〔〕。A.存儲(chǔ)構(gòu)造B.存儲(chǔ)實(shí)現(xiàn)C.邏輯構(gòu)造D.運(yùn)算實(shí)現(xiàn)答案:C〔3〕通常要求同一邏輯構(gòu)造中的所有數(shù)據(jù)元素具有一樣的特性,這意味著〔〕。.?dāng)?shù)據(jù)具有同一特點(diǎn)B.不僅數(shù)據(jù)元素所包含的數(shù)據(jù)項(xiàng)的個(gè)數(shù)要一樣,而且對(duì)應(yīng)數(shù)據(jù)項(xiàng)的類型要一致C.每個(gè)數(shù)據(jù)元素都一樣D.?dāng)?shù)據(jù)元素所包含的數(shù)據(jù)項(xiàng)的個(gè)數(shù)要相等答案:B〔4〕以下說法正確的選項(xiàng)是〔〕。A.?dāng)?shù)據(jù)元素是數(shù)據(jù)的最小單位B.?dāng)?shù)據(jù)項(xiàng)是數(shù)據(jù)的根本單位C.?dāng)?shù)據(jù)構(gòu)造是帶有構(gòu)造的各數(shù)據(jù)項(xiàng)的集合D.一些外表上很不一樣的數(shù)據(jù)可以有一樣的邏輯構(gòu)造答案:D解釋:數(shù)據(jù)元素是數(shù)據(jù)的根本單位,數(shù)據(jù)項(xiàng)是數(shù)據(jù)的最小單位,數(shù)據(jù)構(gòu)造是帶有構(gòu)造的各數(shù)據(jù)元素的集合。〔5〕算法的時(shí)間復(fù)雜度取決于〔〕。A.問題的規(guī)模B.待處理數(shù)據(jù)的初態(tài)C.計(jì)算機(jī)的配置D.A和B答案:D解釋:算法的時(shí)間復(fù)雜度不僅與問題的規(guī)模有關(guān),還與問題的其他因素有關(guān)。如某些排序的算法,其執(zhí)行時(shí)間與待排序記錄的初始狀態(tài)有關(guān)。為此,有時(shí)會(huì)對(duì)算法有最好、最壞以及平均時(shí)間復(fù)雜度的評(píng)價(jià)?!?〕以下數(shù)據(jù)構(gòu)造中,〔〕是非線性數(shù)據(jù)構(gòu)造A.樹B.字符串C.隊(duì)列D.棧答案:A6.試分析下面各程序段的時(shí)間復(fù)雜度。1〕x=90;y=100;while(y>0)if(x>100){x=x-10;y--;}elsex++;答案:O(1)解釋:程序的執(zhí)行次數(shù)為常數(shù)階。word文檔精品文檔分享3word文檔精品文檔分享2〕for(i=0;i<n;i++)for(j=0;j<m;j++)a[i][j]=0;答案:O(m*n)解釋:語句a[i][j]=0;的執(zhí)行次數(shù)為m*n。3〕s=0;fori=0;i<n;i++)for(j=0;j<n;j++)s+=B[i][j];sum=s;2解釋:語句s+=B[i][j];的執(zhí)行次數(shù)為n2。4〕i=1;while(i<=n)i=i*3;答案:O(log3n)解釋:語句i=i*3;的執(zhí)行次數(shù)為log3n。5〕x=0;for(i=1;i<n;i++)for(j=1;j<=n-i;j++)x++;2解釋:語句x++;的執(zhí)行次數(shù)為n-1+n-2+??+1=n(n-1)/2。6〕x=n;//n>1y=0;while(x≥(y+1)*(y+1))y++;答案:O(n)解釋:語句y++;的執(zhí)行次數(shù)為n。word文檔精品文檔分享4word文檔精品文檔分享第2章線性表1.選擇題〔1〕順序表中第一個(gè)元素的存儲(chǔ)地址是100,每個(gè)元素的長(zhǎng)度為2,那么第5個(gè)元素的地址是〔〕。A.110B.108C.100D.120答案:B解釋:順序表中的數(shù)據(jù)連續(xù)存儲(chǔ),所以第5個(gè)元素的地址為:100+2*4=108。〔2〕在n個(gè)結(jié)點(diǎn)的順序表中,算法的時(shí)間復(fù)雜度是O(1)的操作是〔〕。A.訪問第i個(gè)結(jié)點(diǎn)〔1≤i≤n〕和求第i個(gè)結(jié)點(diǎn)的直接前驅(qū)〔2≤i≤n〕B.在第i個(gè)結(jié)點(diǎn)后插入一個(gè)新結(jié)點(diǎn)〔1≤i≤n〕C.刪除第i個(gè)結(jié)點(diǎn)〔1≤i≤n〕D.將n個(gè)結(jié)點(diǎn)從小到大排序答案:A/解釋:在順序表中插入一個(gè)結(jié)點(diǎn)的時(shí)間復(fù)雜度都是O(n2),排序的時(shí)間復(fù)雜度為O(n2)或O(nlog2n)。順序表是一種隨機(jī)存取構(gòu)造,訪問第i個(gè)結(jié)點(diǎn)和求第i個(gè)結(jié)點(diǎn)的直接前驅(qū)都可以直接通過數(shù)組的下標(biāo)直接定位,時(shí)間復(fù)雜度是O(1)?!?〕向一個(gè)有127個(gè)元素的順序表中插入一個(gè)新元素并保持原來順序不變,平均要移動(dòng)的元素個(gè)數(shù)為〔〕。A.8B.63.5C.63D.7答案:B解釋:平均要移動(dòng)的元素個(gè)數(shù)為:n/2。〔4〕存儲(chǔ)的存儲(chǔ)構(gòu)造所占存儲(chǔ)空間〔〕。.分兩局部,一局部存放結(jié)點(diǎn)值,另一局部存放表示結(jié)點(diǎn)間關(guān)系的指針.只有一局部,存放結(jié)點(diǎn)值.只有一局部,存儲(chǔ)表示結(jié)點(diǎn)間關(guān)系的指針.分兩局部,一局部存放結(jié)點(diǎn)值,另一局部存放結(jié)點(diǎn)所占單元數(shù)答案:A〔5〕線性表假設(shè)采用鏈?zhǔn)酱鎯?chǔ)構(gòu)造時(shí),要求內(nèi)存中可用存儲(chǔ)單元的地址〔〕。A.必須是連續(xù)的B.局部地址必須是連續(xù)的C.一定是不連續(xù)的D.連續(xù)或不連續(xù)都可以答案:D〔6〕線性表L在〔〕情況下適用于使用鏈?zhǔn)綐?gòu)造實(shí)現(xiàn)。A.需經(jīng)常修改L中的結(jié)點(diǎn)值B.需不斷對(duì)L進(jìn)展刪除插入C.L中含有大量的結(jié)點(diǎn)D.L中結(jié)點(diǎn)構(gòu)造復(fù)雜word文檔精品文檔分享5word文檔精品文檔分享答案:B解釋:鏈表最大的優(yōu)點(diǎn)在于插入和刪除時(shí)不需要移動(dòng)數(shù)據(jù),直接修改指針即可?!?〕單鏈表的存儲(chǔ)密度〔〕。A.大于 1B.等于 1C.小于 1D.不能確定答案:C解釋:存儲(chǔ)密度是指一個(gè)結(jié)點(diǎn)數(shù)據(jù)本身所占的存儲(chǔ)空間和整個(gè)結(jié)點(diǎn)所占的存儲(chǔ)空間之比,假設(shè)單鏈表一個(gè)結(jié)點(diǎn)本身所占的空間為D,指針域所占的空間為N,那么存儲(chǔ)密度為:D/(D+N),一定小于1。〔8〕將兩個(gè)各有n個(gè)元素的有序表歸并成一個(gè)有序表,其最少的比擬次數(shù)是〔〕。A.nB.2n-1C.2nD.n-1答案:A解釋:當(dāng)?shù)谝粋€(gè)有序表中所有的元素都小于〔或大于〕第二個(gè)表中的元素,只需要用第二個(gè)表中的第一個(gè)元素依次與第一個(gè)表的元素比擬,總計(jì)比擬n次?!?〕在一個(gè)長(zhǎng)度為n的順序表中,在第i個(gè)元素〔1≤i≤n+1〕之前插入一個(gè)新元素時(shí)須向后移動(dòng)〔〕個(gè)元素。A.n-iB.n-i+1C.n-i-1D.I答案:B(10)線性表L=(a1,a,??a),以下說法正確的選項(xiàng)是〔〕。2n.每個(gè)元素都有一個(gè)直接前驅(qū)和一個(gè)直接后繼.線性表中至少有一個(gè)元素.表中諸元素的排列必須是由小到大或由大到?。谝粋€(gè)和最后一個(gè)元素外,其余每個(gè)元素都有一個(gè)且僅有一個(gè)直接前驅(qū)和直接后繼。答案:D(11)創(chuàng)立一個(gè)包括n個(gè)結(jié)點(diǎn)的有序單鏈表的時(shí)間復(fù)雜度是〔〕。A.O(1)B.O(n)C.O(n2)D.O(nlog2n)答案:C解釋:?jiǎn)捂湵韯?chuàng)立的時(shí)間復(fù)雜度是O(n),而要建立一個(gè)有序的單鏈表,那么每生成一個(gè)新結(jié)點(diǎn)時(shí)需要和已有的結(jié)點(diǎn)進(jìn)展比擬,確定適宜的插入位置,所以時(shí)間復(fù)雜度是O(n2)。(12)以下說法錯(cuò)誤的選項(xiàng)是〔〕。.求表長(zhǎng)、定位這兩種運(yùn)算在采用順序存儲(chǔ)構(gòu)造時(shí)實(shí)現(xiàn)的效率不比采用鏈?zhǔn)酱鎯?chǔ)構(gòu)造時(shí)實(shí)現(xiàn)的效率低.順序存儲(chǔ)的線性表可以隨機(jī)存?。捎陧樞虼鎯?chǔ)要求連續(xù)的存儲(chǔ)區(qū)域,所以在存儲(chǔ)管理上不夠靈活.線性表的鏈?zhǔn)酱鎯?chǔ)構(gòu)造優(yōu)于順序存儲(chǔ)構(gòu)造答案:D解釋:鏈?zhǔn)酱鎯?chǔ)構(gòu)造和順序存儲(chǔ)構(gòu)造各有優(yōu)缺點(diǎn),有不同的適用場(chǎng)合。word文檔精品文檔分享6word文檔精品文檔分享(13)在單鏈表中,要將s所指結(jié)點(diǎn)插入到p所指結(jié)點(diǎn)之后,其語句應(yīng)為〔〕。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;答案:D(14)在雙向鏈表存儲(chǔ)構(gòu)造中,刪除p所指的結(jié)點(diǎn)時(shí)須修改指針〔〕。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;答案:A(15)在雙向循環(huán)鏈表中,在p指針?biāo)傅慕Y(jié)點(diǎn)后插入q所指向的新結(jié)點(diǎn),其修改指針的操作是〔〕。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;答案:C2.算法設(shè)計(jì)題〔1〕將兩個(gè)遞增的有序鏈表合并為一個(gè)遞增的有序鏈表。要求結(jié)果鏈表仍使用原來兩個(gè)鏈表的存儲(chǔ)空間,不另外占用其它的存儲(chǔ)空間。表中不允許有重復(fù)的數(shù)據(jù)。[題目分析 ]合并后的新表使用頭指針Lc指向,pa和pb分別是鏈表 La和Lb的工作指針 ,初始化為相應(yīng)鏈表的第一個(gè)結(jié)點(diǎn),從第一個(gè)結(jié)點(diǎn)開場(chǎng)進(jìn)展比擬,當(dāng)兩個(gè)鏈表La和Lb均為到達(dá)表尾結(jié)點(diǎn)時(shí),依次摘取其中較小者重新在Lc表的最后。如果兩個(gè)表中的元素相等,只摘取La表中的元素,刪除Lb表中的元素,這樣確保合并后表中無重復(fù)的元素。當(dāng)一個(gè)表到達(dá)表尾結(jié)點(diǎn),為空時(shí),將非空表的剩余元素直接在Lc表的最后。[算法描述 ]voidMergeList(LinkList&La,LinkList&Lb,LinkList&Lc){//合并鏈表La和Lb,合并后的新表使用頭指針Lc指向pa=La->next;pb=Lb->next;//pa和pb分別是鏈表 La和Lb的工作指針 ,初始化為相應(yīng)鏈表的第一個(gè)結(jié)點(diǎn)Lc=pc=La;//用La的頭結(jié)點(diǎn)作為L(zhǎng)c的頭結(jié)點(diǎn)while(pa&&pb){if(pa->data<pb->data){pc->next=pa;pc=pa;pa=pa->next;}//取較小者 La中的元素,將pa在 pc的后面, pa指針后移elseif(pa->data>pb->data){pc->next=pb;pc=pb;pb=pb->next;}word文檔精品文檔分享7word文檔精品文檔分享//取較小者 Lb中的元素,將pb在 pc的后面, pb指針后移else//相等時(shí)取La中的元素,刪除Lb中的元素{pc->next=pa;pc=pa;pa=pa->next;q=pb->next;deletepb;pb=q;}}pc->next=pa?pa:pb; //插入剩余段deleteLb;//釋放Lb的頭結(jié)點(diǎn)}〔2〕將兩個(gè)非遞減的有序鏈表合并為一個(gè)非遞增的有序鏈表。要求結(jié)果鏈表仍使用原來兩個(gè)鏈表的存儲(chǔ)空間,不另外占用其它的存儲(chǔ)空間。表中允許有重復(fù)的數(shù)據(jù)。[題目分析 ]合并后的新表使用頭指針Lc指向,pa和pb分別是鏈表 La和Lb的工作指針 ,初始化為相應(yīng)鏈表的第一個(gè)結(jié)點(diǎn),從第一個(gè)結(jié)點(diǎn)開場(chǎng)進(jìn)展比擬,當(dāng)兩個(gè)鏈表La和Lb均為到達(dá)表尾結(jié)點(diǎn)時(shí),依次摘取其中較小者重新在Lc表的表頭結(jié)點(diǎn)之后,如果兩個(gè)表中的元素相等,只摘取 La表中的元素,保存Lb表中的元素。當(dāng)一個(gè)表到達(dá)表尾結(jié)點(diǎn),為空時(shí),將非空表的剩余元素依次摘取,在Lc表的表頭結(jié)點(diǎn)之后。[算法描述 ]voidMergeList(LinkList&La,LinkList&Lb,LinkList&Lc,){//合并鏈表La和Lb,合并后的新表使用頭指針Lc指向pa=La->next;pb=Lb->next;//pa和pb分別是鏈表 La和Lb的工作指針 ,初始化為相應(yīng)鏈表的第一個(gè)結(jié)點(diǎn)Lc=pc=La;//用La的頭結(jié)點(diǎn)作為L(zhǎng)c的頭結(jié)點(diǎn)Lc->next=NULL;while(pa||pb){//只要存在一個(gè)非空表,用q指向待摘取的元素if(!pa){q=pb;pb=pb->next;}//La表為空,用q指向pb,pb指針后移elseif(!pb){q=pa;pa=pa->next;}//Lb表為空,用q指向pa,pa指針后移elseif(pa->data<=pb->data){q=pa;pa=pa->next;}//取較小者〔包括相等〕La中的元素,用q指向pa,pa指針后移else{q=pb;pb=pb->next;}//取較小者Lb中的元素,用q指向pb,pb指針后移q->next=Lc->next;Lc->next=q;//將q指向的結(jié)點(diǎn)插在Lc表的表頭結(jié)點(diǎn)之后}deleteLb;//釋放Lb的頭結(jié)點(diǎn)word文檔精品文檔分享8word文檔精品文檔分享}〔3〕兩個(gè)鏈表A和B分別表示兩個(gè)集合,其元素遞增排列。請(qǐng)?jiān)O(shè)計(jì)算法求出A與B的交集,并存放于A鏈表中。[題目分析 ]只有同時(shí)出現(xiàn)在兩集合中的元素才出現(xiàn)在結(jié)果表中,合并后的新表使用頭指針Lc指向。pa和pb分別是鏈表La和Lb的工作指針 ,初始化為相應(yīng)鏈表的第一個(gè)結(jié)點(diǎn),從第一個(gè)結(jié)點(diǎn)開始進(jìn)展比擬,當(dāng)兩個(gè)鏈表La和Lb均為到達(dá)表尾結(jié)點(diǎn)時(shí),如果兩個(gè)表中相等的元素時(shí),摘取La表中的元素,刪除Lb表中的元素;如果其中一個(gè)表中的元素較小時(shí),刪除此表中較小的元素,此表的工作指針后移。當(dāng)鏈表La和Lb有一個(gè)到達(dá)表尾結(jié)點(diǎn),為空時(shí),依次刪除另一個(gè)非空表中的所有元素。[算法描述 ]voidMix(LinkList&La,LinkList&Lb,LinkList&Lc){pa=La->next;pb=Lb->next;pa和pb分別是鏈表La和Lb的工作指針 ,初始化為相應(yīng)鏈表的第一個(gè)結(jié)點(diǎn)Lc=pc=La;//用La的頭結(jié)點(diǎn)作為L(zhǎng)c的頭結(jié)點(diǎn)while(pa&&pb){if(pa->data==pb->data)∥交集并入結(jié)果表中。{pc->next=pa;pc=pa;pa=pa->next;u=pb;pb=pb->next;deleteu;}elseif(pa->data<pb->data){u=pa;pa=pa->next;deleteu;}else{u=pb;pb=pb->next;deleteu;}}while(pa){u=pa;pa=pa->next;deleteu;}∥釋放結(jié)點(diǎn)空間while(pb){u=pb;pb=pb->next;deleteu;}∥釋放結(jié)點(diǎn)空間pc->next=null;∥置鏈表尾標(biāo)記。deleteLb;//釋放Lb的頭結(jié)點(diǎn)}〔4〕兩個(gè)鏈表A和B分別表示兩個(gè)集合,其元素遞增排列。請(qǐng)?jiān)O(shè)計(jì)算法求出兩個(gè)集合A和B的差集〔即僅由在A中出現(xiàn)而不在B中出現(xiàn)的元素所構(gòu)成的集合〕,并以同樣的形式存儲(chǔ),同時(shí)返回該集合的元素個(gè)數(shù)。[題目分析 ]求兩個(gè)集合A和B的差集是指在A中刪除 A和B中共有的元素,即刪除鏈表中的相應(yīng)結(jié)點(diǎn),所以要保存待刪除結(jié)點(diǎn)的前驅(qū),使用指針pre指向前驅(qū)結(jié)點(diǎn)。pa和pb分別是鏈表La和Lb的工作指針 ,初始化為相應(yīng)鏈表的第一個(gè)結(jié)點(diǎn),從第一個(gè)結(jié)點(diǎn)開場(chǎng)進(jìn)展比擬,當(dāng)兩個(gè)鏈表La和Lb均為到達(dá)表尾結(jié)點(diǎn)時(shí),如果La表中的元素小于Lb表中的元素,pre置為L(zhǎng)a表的工作指針pa刪除Lb表中的元素;如果其中一個(gè)表中的元素較小時(shí),刪除此表中較小的元素,此表的工作指針后移。當(dāng)鏈表 La和Lb有一個(gè)為空時(shí),依次刪除另一個(gè)非空表中的所有元素。word文檔精品文檔分享9word文檔精品文檔分享[算法描述 ]voidDifference〔LinkList&La,LinkList&Lb,int*n〕{∥差集的結(jié)果存儲(chǔ)于單鏈表La中,*n是結(jié)果集合中元素個(gè)數(shù),調(diào)用時(shí)為0pa=La->next;pb=Lb->next;∥pa和pb分別是鏈表 La和Lb的工作指針 ,初始化為相應(yīng)鏈表的第一個(gè)結(jié)點(diǎn)pre=La;∥pre為L(zhǎng)a中pa所指結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)的指針while〔pa&&pb〕{if〔pa->data<q->data〕{pre=pa;pa=pa->next;*n++;}∥A鏈表中當(dāng)前結(jié)點(diǎn)指針后移elseif〔pa->data>q->data〕q=q->next;∥B鏈表中當(dāng)前結(jié)點(diǎn)指針后移else{pre->next=pa->next;∥處理A,B中元素值一樣的結(jié)點(diǎn),應(yīng)刪除u=pa;pa=pa->next;deleteu;}∥刪除結(jié)點(diǎn)}}〔5〕設(shè)計(jì)算法將一個(gè)帶頭結(jié)點(diǎn)的單鏈表A分解為兩個(gè)具有一樣構(gòu)造的鏈表B、C,其中B表的結(jié)點(diǎn)為A表中值小于零的結(jié)點(diǎn),而C表的結(jié)點(diǎn)為 A表中值大于零的結(jié)點(diǎn)〔鏈表A中的元素為非零整數(shù),要求B、C表利用A表的結(jié)點(diǎn)〕。[題目分析 ]B表的頭結(jié)點(diǎn)使用原來A表的頭結(jié)點(diǎn),為C表新申請(qǐng)一個(gè)頭結(jié)點(diǎn)。從A表的第一個(gè)結(jié)點(diǎn)開場(chǎng),依次取其每個(gè)結(jié)點(diǎn)p,判斷結(jié)點(diǎn) p的值是否小于0,利用前插法,將小于0的結(jié)點(diǎn)插入B表,大于等于 0的結(jié)點(diǎn)插入C表。[算法描述 ]voidDisCompose(LinkedListA){ B=A;B->next=NULL;∥B表初始化C=newLNode;∥為C申請(qǐng)結(jié)點(diǎn)空間C->next=NULL;∥C初始化為空表p=A->next;∥p為工作指針while(p!=NULL){r=p->next;∥暫存p的后繼if(p->data<0){p->next=B->next;B->next=p;}∥將小于0的結(jié)點(diǎn)鏈入 B表,前插法else{p->next=C->next;C->next=p;}∥將大于等于0的結(jié)點(diǎn)鏈入 C表,前插法p=r;∥p指向新的待處理結(jié)點(diǎn)。}}〔6〕設(shè)計(jì)一個(gè)算法,通過一趟遍歷在單鏈表中確定值最大的結(jié)點(diǎn)。word文檔精品文檔分享10word文檔精品文檔分享[題目分析 ]假定第一個(gè)結(jié)點(diǎn)中數(shù)據(jù)具有最大值,依次與下一個(gè)元素比擬,假設(shè)其小于下一個(gè)元素,那么設(shè)其下一個(gè)元素為最大值,反復(fù)進(jìn)展比擬,直到遍歷完該鏈表。[算法描述 ]ElemTypeMax(LinkListL){if(L->next==NULL)returnNULL;pmax=L->next;//假定第一個(gè)結(jié)點(diǎn)中數(shù)據(jù)具有最大值p=L->next->next;while(p!=NULL){//如果下一個(gè)結(jié)點(diǎn)存在if(p->data>pmax->data)pmax=p;//如果p的值大于pmax的值,那么重新賦值p=p->next;//遍歷鏈表}returnpmax->data;7〕設(shè)計(jì)一個(gè)算法,通過遍歷一趟,將鏈表中所有結(jié)點(diǎn)的方向逆轉(zhuǎn),仍利用原表的存儲(chǔ)空間。[題目分析 ]從首元結(jié)點(diǎn)開場(chǎng),逐個(gè)地把鏈表L的當(dāng)前結(jié)點(diǎn)p插入新的鏈表頭部。[算法描述 ]voidinverse(LinkList&L){//逆置帶頭結(jié)點(diǎn)的單鏈表Lp=L->next;L->next=NULL;while(p){q=p->next; //q指向*p的后繼p->next=L->next;L->next=p;//*p插入在頭結(jié)點(diǎn)之后p=q;}}〔8〕設(shè)計(jì)一個(gè)算法,刪除遞增有序鏈表中值大于mink且小于maxk的所有元素〔 mink和maxk是給定的兩個(gè)參數(shù),其值可以和表中的元素一樣,也可以不同〕。[題目分析 ]分別查找第一個(gè)值>mink的結(jié)點(diǎn)和第一個(gè)值≥maxk的結(jié)點(diǎn),再修改指針,刪除值大于mink且小于maxk的所有元素。[算法描述 ]voiddelete(LinkList&L,intmink,intmaxk){p=L->next;//首元結(jié)點(diǎn)while(p&&p->data<=mink){pre=p;p=p->next;}//查找第一個(gè)值>mink的結(jié)點(diǎn)word文檔精品文檔分享11word文檔精品文檔分享if(p){while(p&&p->data<maxk)p=p->next;//查找第一個(gè)值≥maxk的結(jié)點(diǎn)q=pre->next; pre->next=p;//修改指針while(q!=p){s=q->next;deleteq;q=s;}//釋放結(jié)點(diǎn)空間}//if}〔9〕 p指向雙向循環(huán)鏈表中的一個(gè)結(jié)點(diǎn),其結(jié)點(diǎn)構(gòu)造為data、prior、next三個(gè)域,寫出算法change(p),交換p所指向的結(jié)點(diǎn)和它的前綴結(jié)點(diǎn)的順序。[題目分析 ]知道雙向循環(huán)鏈表中的一個(gè)結(jié)點(diǎn),與前驅(qū)交換涉及到四個(gè)結(jié)點(diǎn)〔p結(jié)點(diǎn),前驅(qū)結(jié)點(diǎn),前驅(qū)的前驅(qū)結(jié)點(diǎn),后繼結(jié)點(diǎn)〕六條鏈。[算法描述 ]voidExchange〔LinkedListp〕∥p是雙向循環(huán)鏈表中的一個(gè)結(jié)點(diǎn),本算法將p所指結(jié)點(diǎn)與其前驅(qū)結(jié)點(diǎn)交換。{q=p->llink;q->llink->rlink=p;∥p的前驅(qū)的前驅(qū)之后繼為pp->llink=q->llink;∥p的前驅(qū)指向其前驅(qū)的前驅(qū)。q->rlink=p->rlink;∥p的前驅(qū)的后繼為p的后繼。q->llink=p;∥p與其前驅(qū)交換p->rlink->llink=q;∥p的后繼的前驅(qū)指向原p的前驅(qū)p->rlink=q;∥p的后繼指向其原來的前驅(qū)}∥算法 exchange完畢?!?0〕長(zhǎng)度為n的線性表 A采用順序存儲(chǔ)構(gòu)造,請(qǐng)寫一時(shí)間復(fù)雜度為O(n)、空間復(fù)雜度為O(1)的算法,該算法刪除線性表中所有值為item的數(shù)據(jù)元素。[題目分析 ]在順序存儲(chǔ)的線性表上刪除元素,通常要涉及到一系列元素的移動(dòng)〔刪第i個(gè)元素,第i+1至第n個(gè)元素要依次前移〕。此題要求刪除線性表中所有值為item的數(shù)據(jù)元素,并未要求元素間的相對(duì)位置不變。因此可以考慮設(shè)頭尾兩個(gè)指針〔i=1,j=n〕,從兩端向中間移動(dòng),凡遇到值item的數(shù)據(jù)元素時(shí),直接將右端元素左移至值為item的數(shù)據(jù)元素位置。[算法描述 ]voidDelete〔ElemTypeA[],intn〕∥A是有 n個(gè)元素的一維數(shù)組,本算法刪除A中所有值為 item的元素。{i=1;j=n;∥設(shè)置數(shù)組低、高端指針〔下標(biāo)〕。while〔i<j〕{while〔i<j&&A[i]!=item〕i++;∥假設(shè)值不為item,左移指針。if〔i<j〕while〔i<j&&A[j]==item〕j--;∥假設(shè)右端元素為item,指針左移word文檔精品文檔分享12word文檔精品文檔分享if〔i<j〕A[i++]=A[j--];}word文檔精品文檔分享13word文檔精品文檔分享第3章棧和隊(duì)列1.選擇題〔1〕假設(shè)讓元素 1,2,3,4,5依次進(jìn)棧,那么出棧次序不可能出現(xiàn)在〔〕種情況。A.5,4,3,2,1B.2,1,5,4,3C.4,3,1,2,5D.2,3,5,4,1答案:C解釋:棧是后進(jìn)先出的線性表,不難發(fā)現(xiàn)C選項(xiàng)中元素 1比元素 2先出棧,違背了棧的后進(jìn)先出原那么,所以不可能出現(xiàn)C選項(xiàng)所示的情況?!?〕假設(shè)一個(gè)棧的入棧序列是1,2,3,?,n,其輸出序列為p1,p2,p3,?,pn,假設(shè)p1=n,那么 pi為〔〕。A.iB.n-iC.n-i+1D.不確定答案:C解釋:棧是后進(jìn)先出的線性表,一個(gè)棧的入棧序列是1,2,3,?,n,而輸出序列的第一個(gè)元素為n,說明 1,2,3,?,n一次性全部進(jìn)棧,再進(jìn)展輸出,所以p1=n,p2=n-1,?,pi=n-i+1?!?〕數(shù)組Q[n]用來表示一個(gè)循環(huán)隊(duì)列,f為當(dāng)前隊(duì)列頭元素的前一位置,r?yàn)殛?duì)尾元素的位置,假定隊(duì)列中元素的個(gè)數(shù)小于n,計(jì)算隊(duì)列中元素個(gè)數(shù)的公式為〔〕。A.r-fB.(n+f-r)%nC.n+r-fD.〔n+r-f)%n答案:D解釋:對(duì)于非循環(huán)隊(duì)列,尾指針和頭指針的差值便是隊(duì)列的長(zhǎng)度,而對(duì)于循環(huán)隊(duì)列,差值可能為負(fù)數(shù),所以需要將差值加上MAXSIZE〔此題為n〕,然后與 MAXSIZE〔此題為n〕求余,即〔n+r-f)%n?!?〕鏈?zhǔn)綏=Y(jié)點(diǎn)為:(data,link),top指向棧頂.假設(shè)想摘除棧頂結(jié)點(diǎn),并將刪除結(jié)點(diǎn)的值保存到x中,那么應(yīng)執(zhí)行操作〔〕。A.x=top->data;top=top->link;B.top=top->link;x=top->link;C.x=top;top=top->link;D.x=top->link;答案:A解釋:x=top->data將結(jié)點(diǎn)的值保存到x中,top=top->link棧頂指針指向棧頂下一結(jié)點(diǎn),即摘除棧頂結(jié)點(diǎn)?!?〕設(shè)有一個(gè)遞歸算法如下intfact(intn){//n大于等于 0if(n<=0)return1;elsereturnn*fact(n-1);}那么計(jì)算 fact(n)需要調(diào)用該函數(shù)的次數(shù)為〔〕。A.n+1B.n-1C. nD. n+2答案:Aword文檔精品文檔分享14word文檔精品文檔分享解釋:特殊值法。設(shè)n=0,易知僅調(diào)用一次fact(n)函數(shù),應(yīng)選A?!?〕棧在〔〕中有所應(yīng)用。A.遞歸調(diào)用B.函數(shù)調(diào)用C.表達(dá)式求值D.前三個(gè)選項(xiàng)都有答案:D解釋:遞歸調(diào)用、函數(shù)調(diào)用、表達(dá)式求值均用到了棧的后進(jìn)先出性質(zhì)。7〕為解決計(jì)算機(jī)主機(jī)與打印機(jī)間速度不匹配問題,通常設(shè)一個(gè)打印數(shù)據(jù)緩沖區(qū)。主機(jī)將要輸出的數(shù)據(jù)依次寫入該緩沖區(qū),而打印機(jī)那么依次從該緩沖區(qū)中取出數(shù)據(jù)。該緩沖區(qū)的邏輯構(gòu)造應(yīng)該是〔〕。A.隊(duì)列B.棧C.線性表D.有序表答案:A解釋:解決緩沖區(qū)問題應(yīng)利用一種先進(jìn)先出的線性表,而隊(duì)列正是一種先進(jìn)先出的線性表?!?〕設(shè)棧 S和隊(duì)列 Q的初始狀態(tài)為空,元素e1、e2、e3、e4、e5和e6依次進(jìn)入棧S,一個(gè)元素出棧后即進(jìn)入Q,假設(shè)6個(gè)元素出隊(duì)的序列是e2、e4、e3、e6、e5和e1,那么棧 S的容量至少應(yīng)該是〔〕。A.2B.3C.4D. 6答案:B解釋:元素出隊(duì)的序列是e2、e4、e3、e6、e5和e1,可知元素入隊(duì)的序列是e2、e4、e3、e6、e5和e1,即元素出棧的序列也是e2、e4、e3、e6、e5和e1,而元素e1、e2、e3、e4、e5和e6依次進(jìn)入棧,易知棧S中最多同時(shí)存在3個(gè)元素,故棧S的容量至少為3。〔9〕假設(shè)一個(gè)棧以向量V[1..n]存儲(chǔ),初始棧頂指針top設(shè)為n+1,那么元素 x進(jìn)棧的正確操作是()。A.top++;V[top]=x;B.V[top]=x;top++;C.top--;V[top]=x;D.V[top]=x;top--;答案:C解釋:初始棧頂指針top為n+1,說明元素從數(shù)組向量的高端地址進(jìn)棧,又因?yàn)樵卮鎯?chǔ)在向量空間V[1..n]中,所以進(jìn)棧時(shí)top指針先下移變?yōu)閚,之后將元素x存儲(chǔ)在V[n]?!?0〕設(shè)計(jì)一個(gè)判別表達(dá)式中左,右括號(hào)是否配對(duì)出現(xiàn)的算法,采用〔〕數(shù)據(jù)構(gòu)造最佳。A.線性表的順序存儲(chǔ)構(gòu)造B.隊(duì)列C.線性表的鏈?zhǔn)酱鎯?chǔ)構(gòu)造D.棧答案:D解釋:利用棧的后進(jìn)先出原那么?!?1〕用方式存儲(chǔ)的隊(duì)列,在進(jìn)展刪除運(yùn)算時(shí)〔〕。A.僅修改頭指針B.僅修改尾指針C.頭、尾指針都要修改D.頭、尾指針可能都要修改答案:D解釋:一般情況下只修改頭指針,但是,當(dāng)刪除的是隊(duì)列中最后一個(gè)元素時(shí),隊(duì)尾指word文檔精品文檔分享15word文檔精品文檔分享針也喪失了,因此需對(duì)隊(duì)尾指針重新賦值?!?2〕循環(huán)隊(duì)列存儲(chǔ)在數(shù)組A[0..m]中,那么入隊(duì)時(shí)的操作為〔〕。A.rear=rear+1B.rear=(rear+1)%(m-1)C.rear=(rear+1)%mD.rear=(rear+1)%(m+1)答案:D解釋:數(shù)組A[0..m]中共含有m+1個(gè)元素,故在求模運(yùn)算時(shí)應(yīng)除以m+1?!?3〕最大容量為n的循環(huán)隊(duì)列,隊(duì)尾指針是rear,隊(duì)頭是 front,那么隊(duì)空的條件是〔〕。A.(rear+1)%n==frontB.rear==frontC.rear+1==frontD.(rear-l)%n==front答案:B解釋:最大容量為 n的循環(huán)隊(duì)列,隊(duì)滿條件是(rear+1)%n==front,隊(duì)空條件是rear==front?!?4〕棧和隊(duì)列的共同點(diǎn)是〔〕。A.都是先進(jìn)先出B.都是先進(jìn)后出C.只允許在端點(diǎn)處插入和刪除元素D.沒有共同點(diǎn)答案:C解釋:棧只允許在棧頂處進(jìn)展插入和刪除元素,隊(duì)列只允許在隊(duì)尾插入元素和在隊(duì)頭刪除元素。〔15〕一個(gè)遞歸算法必須包括〔〕。A.遞歸局部B.終止條件和遞歸局部C.迭代局部D.終止條件和迭代局部答案:B2.算法設(shè)計(jì)題〔1〕將編號(hào)為 0和1的兩個(gè)棧存放于一個(gè)數(shù)組空間V[m]中,棧底分別處于數(shù)組的兩端。當(dāng)?shù)?0號(hào)棧的棧頂指針top[0]等于-1時(shí)該棧為空,當(dāng)?shù)?號(hào)棧的棧頂指針top[1]等于 m時(shí)該棧為空。兩個(gè)棧均從兩端向中間增長(zhǎng)。試編寫雙棧初始化,判斷棧空、棧滿、進(jìn)棧和出棧等算法的函數(shù)。雙棧數(shù)據(jù)構(gòu)造的定義如下:Typedefstruct{inttop[2],bot[2];//棧頂和棧底指針SElemType*V;//棧數(shù)組intm;//棧最大可容納元素個(gè)數(shù)}DblStack[題目分析 ]兩棧共享向量空間,將兩棧棧底設(shè)在向量?jī)啥?,初始時(shí),左棧頂指針為-1,右棧頂為m。兩棧頂指針相鄰時(shí)為棧滿。兩棧頂相向、迎面增長(zhǎng),棧頂指針指向棧頂元素。[算法描述 ](1)棧初始化word文檔精品文檔分享16word文檔精品文檔分享intInit(){S.top[0]=-1;S.top[1]=m;return1;//初始化成功}入棧操作:intpush(stkS,inti,intx)∥i為棧號(hào), i=0表示左棧, i=1為右棧, x是入棧元素。入棧成功返回1,失敗返回 0{if(i<0||i>1){cout<<“棧號(hào)輸入不對(duì)〞<<endl;exit(0);}if(S.top[1]-S.top[0]==1){cout<<“棧已滿〞<<endl;return(0);}switch(i){case0:S.V[++S.top[0]]=x;return(1);break;case1:S.V[--S.top[1]]=x;return(1);}}∥push退棧操作ElemTypepop(stkS,inti)∥退棧。 i代表?xiàng)L?hào), i=0時(shí)為左棧, i=1時(shí)為右棧。退棧成功時(shí)返回退棧元素∥否那么返回-1{if(i<0||i>1){cout<<“棧號(hào)輸入錯(cuò)誤〞<<endl;exit(0);}switch(i){case0:if(S.top[0]==-1){cout<<“棧空〞<<endl;return〔-1〕;}elsereturn(S.V[S.top[0]--]);case1:if(S.top[1]==m{cout<<“棧空〞<<endl;return(-1);}elsereturn(S.V[S.top[1]++]);}∥switch}∥算法完畢判斷棧空intEmpty();{return(S.top[0]==-1&&S.top[1]==m);}[算法討論 ]請(qǐng)注意算法中兩棧入棧和退棧時(shí)的棧頂指針的計(jì)算。左棧是通常意義下的棧,而右棧入棧操作時(shí),其棧頂指針左移〔減1〕,退棧時(shí),棧頂指針右移〔加1〕?!?〕回文是指正讀反讀均一樣的字符序列,如“abba〞和“abdba〞均是回文,但“good〞不是回文。試寫一個(gè)算法判定給定的字符向量是否為回文。(提示:將一半字符入棧)[題目分析 ]word文檔精品文檔分享17word文檔精品文檔分享將字符串前一半入棧,然后,棧中元素和字符串后一半進(jìn)展比擬。即將第一個(gè)出棧元素和后一半串中第一個(gè)字符比擬,假設(shè)相等,那么再出棧一個(gè)元素與后一個(gè)字符比擬,??,直至???,結(jié)論為字符序列是回文。在出棧元素與串中字符比擬不等時(shí),結(jié)論字符序列不是回文。[算法描述 ]#defineStackSize100//假定預(yù)分配的棧空間最多為100個(gè)元素typedefcharDataType;//假定棧元素的數(shù)據(jù)類型為字符typedefstruct{DataTypedata[StackSize];inttop;}SeqStack;intIsHuiwen(char*t){//判斷t字符向量是否為回文,假設(shè)是,返回1,否那么返回 0SeqStacks;inti,len;chartemp;InitStack(&s);len=strlen(t);//求向量長(zhǎng)度for(i=0;i<len/2;i++)//將一半字符入棧Push(&s,t[i]);while(!EmptyStack(&s)){//每彈出一個(gè)字符與相應(yīng)字符比擬temp=Pop(&s);if(temp!=S[i])return0;//不等那么返回0elsei++;}return1;//比擬完畢均相等那么返回1}3〕設(shè)從鍵盤輸入一整數(shù)的序列:a1,a2,a3,?,an,試編寫算法實(shí)現(xiàn):用棧構(gòu)造存儲(chǔ)輸入的整數(shù),當(dāng)ai≠-1時(shí),將ai進(jìn)棧;當(dāng)ai=-1時(shí),輸出棧頂整數(shù)并出棧。算法應(yīng)對(duì)異常情況〔入棧滿等〕給出相應(yīng)的信息。[算法描述 ]#definemaxsize??臻g容量voidInOutS(ints[maxsize])//s是元素為整數(shù)的棧,本算法進(jìn)展入棧和退棧操作。{inttop=0;//top為棧頂指針,定義top=0時(shí)為???。for(i=1;i<=n;i++) //n個(gè)整數(shù)序列作處理。{cin>>x); //從鍵盤讀入整數(shù)序列。word文檔精品文檔分享18word文檔精品文檔分享if(x!=-1)//讀入的整數(shù)不等于-1時(shí)入棧。{if(top==maxsize-1){cout<<“棧滿〞<<endl;exit(0);}elses[++top]=x;//x入棧。}else //讀入的整數(shù)等于-1時(shí)退棧。{if(top==0){cout<<“棧空〞<<endl;exit(0);}elsecout<<“出棧元素是〞<<s[top--]<<endl;}}}//算法完畢?!?〕從鍵盤上輸入一個(gè)后綴表達(dá)式,試編寫算法計(jì)算表達(dá)式的值。規(guī)定:逆波蘭表達(dá)式的長(zhǎng)度不超過一行,以$符作為輸入完畢,操作數(shù)之間用空格分隔,操作符只可能有+、-、*、/四種運(yùn)算。例如:23434+2*$。[題目分析 ]逆波蘭表達(dá)式(即后綴表達(dá)式 )求值規(guī)那么如下:設(shè)立運(yùn)算數(shù)棧OPND,對(duì)表達(dá)式從左到右掃描(讀入),當(dāng)表達(dá)式中掃描到數(shù)時(shí),壓入OPND棧。當(dāng)掃描到運(yùn)算符時(shí),從OPND退出兩個(gè)數(shù),進(jìn)展相應(yīng)運(yùn)算,結(jié)果再壓入OPND棧。這個(gè)過程一直進(jìn)展到讀出表達(dá)式完畢符$,這時(shí)OPND棧中只有一個(gè)數(shù),就是結(jié)果。[算法描述 ]floatexpr()//從鍵盤輸入逆波蘭表達(dá)式,以‘$’表示輸入完畢,本算法求逆波蘭式表達(dá)式的值。{floatOPND[30]; //OPND是操作數(shù)棧。init(OPND);//兩棧初始化。floatnum=0.0; //數(shù)字初始化。cin>>x;//x是字符型變量。while(x!=’$’){switch{case‘0’<=x<=’9’:while((x>=’0’&&x<=’9’)||x==’.’)//拼數(shù)if(x!=’.’) //處理整數(shù){num=num*10+〔ord(x)- ord(‘0’)〕 ;cin>>x;}else//處理小數(shù)局部。{scale=10.0;cin>>x;while(x>=’0’&&x<=’9’){num=num+(ord(x)-ord(‘0’)/scale;scale=scale*10;cin>>x;}}//elsepush(OPND,num);num=0.0;//數(shù)壓入棧,下個(gè)數(shù)初始化word文檔精品文檔分享19word文檔精品文檔分享casex=‘ ’:break;//遇空格,繼續(xù)讀下一個(gè)字符。casex=‘+’:push(OPND,pop(OPND)+pop(OPND));break;casex=‘-’:x1=pop(OPND);x2=pop(OPND);push(OPND,x2-x1);break;casex=‘*’:push(OPND,pop(OPND)*pop(OPND));break;casex=‘/’:x1=pop(OPND);x2=pop(OPND);push(OPND,x2/x1);break;default://其它符號(hào)不作處理。}//完畢 switchcin>>x;//讀入表達(dá)式中下一個(gè)字符。}//完畢 while〔x!=‘$’〕cout<<“后綴表達(dá)式的值為〞<<pop(OPND);}//算法完畢。[算法討論]假設(shè)輸入的后綴表達(dá)式是正確的,未作錯(cuò)誤檢查。算法中拼數(shù)局部是核心。假設(shè)遇到大于等于‘0’且小于等于‘ 9’的字符,認(rèn)為是數(shù)。這種字符的序號(hào)減去字符‘0’的序號(hào)得出數(shù)。對(duì)于整數(shù),每讀入一個(gè)數(shù)字字符,前面得到的局部數(shù)要乘上10再加新讀入的數(shù)得到新的局部數(shù)。當(dāng)讀到小數(shù)點(diǎn),認(rèn)為數(shù)的整數(shù)局部已完,要接著處理小數(shù)局部。小數(shù)局部的數(shù)要除以10〔或10的冪數(shù)〕變成十分位,百分位,千分位數(shù)等等,與前面局部數(shù)相加。在拼數(shù)過程中,假設(shè)遇非數(shù)字字符,表示數(shù)已拼完,將數(shù)壓入棧中,并且將變量num恢復(fù)為0,準(zhǔn)備下一個(gè)數(shù)。這時(shí)對(duì)新讀入的字符進(jìn)入‘+’、‘-’、‘*’、‘/’及空格的判斷,因此在完畢處理數(shù)字字符的case后,不能參加break語句?!?〕假設(shè)以 I和O分別表示入棧和出棧操作。棧的初態(tài)和終態(tài)均為空,入棧和出棧的操作序列可表示為僅由I和O組成的序列,稱可以操作的序列為合法序列,否那么稱為非法序列。①下面所示的序列中哪些是合法的?A.IOIIOIOO B.IOOIOIIOC.IIIOIOIO D.IIIOOIOO②通過對(duì)①的分析,寫出一個(gè)算法,判定所給的操作序列是否合法。假設(shè)合法,返回true,否那么返回false〔假定被判定的操作序列已存入一維數(shù)組中〕。答案:①A和D是合法序列,B和C是非法序列。②設(shè)被判定的操作序列已存入一維數(shù)組A中。intJudge(charA[])//判斷字符數(shù)組A中的輸入輸出序列是否是合法序列。如是,返回true,否那么返回false。{i=0;//i為下標(biāo)。j=k=0;//j和k分別為I和字母O的的個(gè)數(shù)。while(A[i]!=‘ 0’)//當(dāng)未到字符數(shù)組尾就作。{switch(A[i]){case‘I’:j++;break;//入棧次數(shù)增1。case‘O’:k++;if(k>j){cout<<“序列非法〞 <<ednl;exit(0);}word文檔精品文檔分享20word文檔精品文檔分享}i++;//不管A[i]是‘I’或‘O’,指針i均后移。 }if(j!=k){cout<<“序列非法〞<<endl;return(false);}else{cout<<“序列合法〞<<endl;return(true);}}//算法完畢。[算法討論 ]在入棧出棧序列〔即由‘I’和‘O’組成的字符串〕的任一位置,入棧次數(shù)〔‘I’的個(gè)數(shù)〕都必須大于等于出棧次數(shù)〔即‘O’的個(gè)數(shù)〕,否那么視作非法序列,立即給出信息,退出算法。整個(gè)序列〔即讀到字符數(shù)組中字符串的完畢標(biāo)記‘\0’〕,入棧次數(shù)必須等于出棧次數(shù)〔題目中要求棧的初態(tài)和終態(tài)都為空〕,否那么視為非法序列。(6〕假設(shè)以帶頭結(jié)點(diǎn)的循環(huán)鏈表表示隊(duì)列,并且只設(shè)一個(gè)指針指向隊(duì)尾元素站點(diǎn)(注意不設(shè)頭指針 ),試編寫相應(yīng)的置空隊(duì)、判隊(duì)空、入隊(duì)和出隊(duì)等算法。[題目分析 ]置空隊(duì)就是建立一個(gè)頭節(jié)點(diǎn),并把頭尾指針都指向頭節(jié)點(diǎn),頭節(jié)點(diǎn)是不存放數(shù)據(jù)的;判隊(duì)空就是當(dāng)頭指針等于尾指針時(shí),隊(duì)空;入隊(duì)時(shí),將新的節(jié)點(diǎn)插入到鏈隊(duì)列的尾部,同時(shí)將尾指針指向這個(gè)節(jié)點(diǎn);出隊(duì)時(shí),刪除的是隊(duì)頭節(jié)點(diǎn),要注意隊(duì)列的長(zhǎng)度大于1還是等于 1的情況,這個(gè)時(shí)候要注意尾指針的修改,如果等于1,那么要?jiǎng)h除尾指針指向的節(jié)點(diǎn)。[算法描述 ]//先定義鏈隊(duì)構(gòu)造:typedefstructqueuenode{Datatypedata;structqueuenode*next;}QueueNode;//以上是結(jié)點(diǎn)類型的定義typedefstruct{queuenode*rear;}LinkQueue;//只設(shè)一個(gè)指向隊(duì)尾元素的指針置空隊(duì)voidInitQueue(LinkQueue*Q){//置空隊(duì):就是使頭結(jié)點(diǎn)成為隊(duì)尾元素QueueNode*s;Q->rear=Q->rear->next;//將隊(duì)尾指針指向頭結(jié)點(diǎn)while(Q->rear!=Q->rear->next)//當(dāng)隊(duì)列非空,將隊(duì)中元素逐個(gè)出隊(duì){s=Q->rear->next;Q->rear->next=s->next;deletes;}//回收結(jié)點(diǎn)空間}word文檔精品文檔分享21word文檔精品文檔分享判隊(duì)空intEmptyQueue(LinkQueue*Q){//判隊(duì)空。當(dāng)頭結(jié)點(diǎn)的next指針指向自己時(shí)為空隊(duì)returnQ->rear->next->next==Q->rear->next;}入隊(duì)voidEnQueue(LinkQueue*Q,Datatypex){//入隊(duì)。也就是在尾結(jié)點(diǎn)處插入元素QueueNode*p=newQueueNode;//申請(qǐng)新結(jié)點(diǎn)p->data=x;p->next=Q->rear->next;//初始化新結(jié)點(diǎn)并鏈入Q-rear->next=p;Q->rear=p;//將尾指針移至新結(jié)點(diǎn)}(4)出隊(duì)DatatypeDeQueue(LinkQueue*Q){//出隊(duì),把頭結(jié)點(diǎn)之后的元素摘下Datatypet;QueueNode*p;if(EmptyQueue(Q))Error("Queueunderflow");p=Q->rear->next->next;//p指向?qū)⒁碌慕Y(jié)點(diǎn)x=p->data;//保存結(jié)點(diǎn)中數(shù)據(jù)if(p==Q->rear){//當(dāng)隊(duì)列中只有一個(gè)結(jié)點(diǎn)時(shí),p結(jié)點(diǎn)出隊(duì)后,要將隊(duì)尾指針指向頭結(jié)點(diǎn)Q->rear=Q->rear->next;Q->rear->next=p->next;}elseQ->rear->next->next=p->next;//摘下結(jié)點(diǎn)pdeletep;//釋放被刪結(jié)點(diǎn)returnx;}〔7〕假設(shè)以數(shù)組 Q[m]存放循環(huán)隊(duì)列中的元素,同時(shí)設(shè)置一個(gè)標(biāo)志tag,以tag== 0和tag==1來區(qū)別在隊(duì)頭指針(front)和隊(duì)尾指針 (rear)相等時(shí),隊(duì)列狀態(tài)為“空〞還是“滿〞。試編寫與word文檔精品文檔分享22word文檔精品文檔分享此構(gòu)造相應(yīng)的插入(enqueue)和刪除(dlqueue)算法。[算法描述 ]初始化SeQueueQueueInit(SeQueueQ){//初始化隊(duì)列Q.front=Q.rear=0;Q.tag=0;returnQ;}入隊(duì)SeQueueQueueIn(SeQueueQ,inte){//入隊(duì)列if((Q.tag==1)&&(Q.rear==Q.front))cout<<"隊(duì)列已滿"<<endl;else{Q.rear=(Q.rear+1)%m;Q.data[Q.rear]=e;if(Q.tag==0)Q.tag=1;//隊(duì)列已不空}returnQ;}(3)出隊(duì)ElemTypeQueueOut(SeQueueQ){//出隊(duì)列if(Q.tag==0){cout<<"隊(duì)列為空"<<endl;exit(0);}else{Q.front=(Q.front+1)%m;e=Q.data[Q.front];if(Q.front==Q.rear)Q.tag=0;//空隊(duì)列}return(e);}(8〕如果允許在循環(huán)隊(duì)列的兩端都可以進(jìn)展插入和刪除操作。要求:①寫出循環(huán)隊(duì)列的類型定義;②寫出“從隊(duì)尾刪除〞和“從隊(duì)頭插入〞的算法。[題目分析 ]用一維數(shù)組v[0..M-1]實(shí)現(xiàn)循環(huán)隊(duì)列,其中M是隊(duì)列長(zhǎng)度。設(shè)隊(duì)頭指針front和隊(duì)尾指針rear,約定 front指向隊(duì)頭元素的前一位置,rear指向隊(duì)尾元素。定義front=rear時(shí)為隊(duì)空, (rear+1)%m=front為隊(duì)滿。約定隊(duì)頭端入隊(duì)向下標(biāo)小的方向開展,隊(duì)尾端入隊(duì)向下標(biāo)大的方向開展。word文檔精品文檔分享23word文檔精品文檔分享[算法描述 ]①#defineM隊(duì)列可能到達(dá)的最大長(zhǎng)度typedefstruct{elemtpdata[M];intfront,rear;}cycqueue;②elemtpdelqueue(cycqueueQ)//Q是如上定義的循環(huán)隊(duì)列,本算法實(shí)現(xiàn)從隊(duì)尾刪除,假設(shè)刪除成功,返回被刪除元素,否那么給出出錯(cuò)信息。{if(Q.front==Q.rear){cout<<"隊(duì)列空"<<endl;exit(0);}Q.rear=(Q.rear-1+M)%M;//修改隊(duì)尾指針。return(Q.data[(Q.rear+1+M)%M]);//返回出隊(duì)元素。}//從隊(duì)尾刪除算法完畢voidenqueue(cycqueueQ,elemtpx)//Q是順序存儲(chǔ)的循環(huán)隊(duì)列,本算法實(shí)現(xiàn)“從隊(duì)頭插入〞元素x。{if(Q.rear==(Q.front-1+M)%M){cout<<"隊(duì)滿"<<endl;exit(0);)Q.data[Q.front]=x;//x入隊(duì)列Q.front=(Q.front-1+M)%M;//修改隊(duì)頭指針。}//完畢從隊(duì)頭插入算法。9〕Ackermann函數(shù)定義如下:①寫出計(jì)算Ack(m,n)的遞歸算法,并根據(jù)此算法給出出Ack(2,1)的計(jì)算過程。②寫出計(jì)算Ack(m,n)的非遞歸算法。[算法描述 ]intAck(intm,n){if(m==0)return(n+1);elseif(m!=0&&n==0)return(Ack(m-1,1));elsereturn(Ack(m-1,Ack(m,m-1));}//算法完畢① Ack(2,1)的計(jì)算過程Ack(2,1)=Ack(1,Ack(2,0))//因m<>0,n<>0而得=Ack(1,Ack(1,1))//因m<>0,n=0而得word文檔精品文檔分享24word文檔精品文檔分享=Ack(1,Ack(0,Ack(1,0)))//因m<>0,n<>0而得=Ack(1,Ack(0,Ack(0,1)))//因m<>0,n=0而得=Ack(1,Ack(0,2))//因m=0而得=Ack(1,3)//因m=0而得=Ack(0,Ack(1,2))//因m<>0,n<>0而得=Ack(0,Ack(0,Ack(1,1)))//因m<>0,n<>0而得=Ack(0,Ack(0,Ack(0,Ack(1,0))))//因m<>0,n<>0而得=Ack(0,Ack(0,Ack(0,Ack(0,1))))//因m<>0,n=0而得=Ack(0,Ack(0,Ack(0,2)))//因m=0而得=Ack(0,Ack(0,3))//因m=0而得=Ack(0,4)//因n=0而得=5//因n=0而得②intAckerman(intm,intn){intakm[M][N];inti,j;for(j=0;j<N;j++)akm[0][j]=j+1;for(i=1;i<m;i++){akm[i][0]=akm[i-1][1];for(j=1;j<N;j++)akm[i][j]=akm[i-1][akm[i][j-1]];}return(akm[m][n]);}//算法完畢10〕f為單鏈表的表頭指針,鏈表中存儲(chǔ)的都是整型數(shù)據(jù),試寫出實(shí)現(xiàn)以下運(yùn)算的遞歸算法:求鏈表中的最大整數(shù);②求鏈表的結(jié)點(diǎn)個(gè)數(shù);③求所有整數(shù)的平均值。[算法描述 ]①intGetMax(LinkListp){if(!p->next)returnp->data;else{intmax=GetMax(p->next);word文檔精品文檔分享25word文檔精品文檔分享returnp->data>=max?p->data:max;}}②intGetLength(LinkListp){if(!p->next)return1;else{returnGetLength(p->next)+1;}}③doubleGetAverage(LinkListp,intn){if(!p->next)returnp->data;else{doubleave=GetAverage(p->next,n-1);return(ave*(n-1)+p->data)/n;}}word文檔精品文檔分享26word文檔精品文檔分享第4章串、數(shù)組和廣義表1.選擇題〔1〕串是一種特殊的線性表,其特殊性表達(dá)在〔〕。A.可以順序存儲(chǔ)B.?dāng)?shù)據(jù)元素是一個(gè)字符C.可以鏈?zhǔn)酱鎯?chǔ)D.?dāng)?shù)據(jù)元素可以是多個(gè)字符假設(shè)答案:B〔2〕串下面關(guān)于串的的表達(dá)中,〔〕是不正確的?A.串是字符的有限序列B.空串是由空格構(gòu)成的串C.模式匹配是串的一種重要運(yùn)算D.串既可以采用順序存儲(chǔ),也可以采用鏈?zhǔn)酱鎯?chǔ)答案:B解釋:空格常常是串的字符集合中的一個(gè)元素,有一個(gè)或多個(gè)空格組成的串成為空格串,零個(gè)字符的串成為空串,其長(zhǎng)度為零。〔3〕串“ababaaababaa〞的 next數(shù)組為〔〕。A.012345678999B.012121111212C.011234223456D.0123012322345答案:C〔4〕串“ababaabab〞的nextval為〔〕。A.010104101B.010102101C.010100011D.010101011答案:A〔5〕串的長(zhǎng)度是指〔〕。A.串中所含不同字母的個(gè)數(shù)B.串中所含字符的個(gè)數(shù)C.串中所含不同字符的個(gè)數(shù)D.串中所含非空格字符的個(gè)數(shù)答案:B解釋:串中字符的數(shù)目稱為串的長(zhǎng)度。〔6〕假設(shè)以行序?yàn)橹餍虼鎯?chǔ)二維數(shù)組A=array[1..100,1..100],設(shè)每個(gè)數(shù)據(jù)元素占2個(gè)存儲(chǔ)單元,基地址為10,那么LOC[5,5]=〔〕。A.808B.818C.1010D.1020答案:B解釋:以行序?yàn)橹?,那么LOC[5,5]=[〔5-1〕*100+〔5-1〕]*2+10=818。〔7〕設(shè)有數(shù)組 A[i,j],數(shù)組的每個(gè)元素長(zhǎng)度為3字節(jié),i的值為 1到8,j的值為1到10,數(shù)組從內(nèi)存首地址BA開場(chǎng)順序存放,當(dāng)用以列為主存放時(shí),元素A[5,8]的存儲(chǔ)首地址為〔〕。A.BA+141B.BA+180C.BA+222D.BA+225答案:B解釋:以列序?yàn)橹?,那么LOC[5,8]=[〔8-1〕*8+〔5-1〕]*3+BA=BA+180?!?〕設(shè)有一個(gè) 10階的對(duì)稱矩陣A,采用壓縮存儲(chǔ)方式,以行序?yàn)橹鞔鎯?chǔ),a11為第一元素,其存儲(chǔ)地址為1,每個(gè)元素占一個(gè)地址空間,那么a85的地址為〔〕。word文檔精品文檔分享27word文檔精品文檔分享A.13B.32C.33D.40答案:C〔9〕假設(shè)對(duì)n階對(duì)稱矩陣A以行序?yàn)橹餍蚍绞綄⑵湎氯切蔚脑?包括主對(duì)角線上所有元素)依次存放于一維數(shù)組B[1..(n(n+1))/2]中,那么在B中確定aij〕。〔i<j〕的位置k的關(guān)系為〔A.i*(i-1)/2+jB.j*(j-1)/2+iC.i*(i+1)/2+jD.j*(j+1)/2+i答案:B〔10〕二維數(shù)組A的每個(gè)元素是由10個(gè)字符組成的串,其行下標(biāo)i=0,1,?,8,列下標(biāo)j=1,2,?,10。假設(shè)A按行先存儲(chǔ),元素A[8,5]的起始地址與當(dāng)A按列先存儲(chǔ)時(shí)的元素〔〕的起始地址一樣。設(shè)每個(gè)字符占一個(gè)字節(jié)。A.A[8,5]B.A[3,10]C.A[5,8]D.A[0,9]答案:B解釋:設(shè)數(shù)組從內(nèi)存首地址M開場(chǎng)順序存放,假設(shè)數(shù)組按行先存儲(chǔ),元素A[8,5]的起始地址為:M+[〔8-0〕*10+〔5-1〕]*1=M+84;假設(shè)數(shù)組按列先存儲(chǔ),易計(jì)算出元素A[3,10]的起始地址為:M+[〔10-1〕*9+〔3-0〕]*1=M+84。應(yīng)選B。〔11〕設(shè)二維數(shù)組A[1..m,1..n]〔即m行n列〕按行存儲(chǔ)在數(shù)組B[1..m*n]中,那么二維數(shù)組元素A[i,j]在一維數(shù)組B中的下標(biāo)為〔〕。A.(i-1)*n+jB.(i-1)*n+j-1C.i*(j-1)D.j*m+i-1答案:A解釋:特殊值法。取i=j=1,易知A[1,1]的的下標(biāo)為1,四個(gè)選項(xiàng)中僅有A選項(xiàng)能確定的值為1,應(yīng)選A?!?2〕數(shù)組 A[0..4,-1..-3,5..7]中含有元素的個(gè)數(shù)〔〕。A.55B.45C.36D.16答案:B解釋:共有5*3*3=45個(gè)元素。〔13〕廣義表 A=(a,b,(c,d),(e,(f,g))),那么Head(Tail(Head(Tail(Tail(A)))))的值為〔〕。A.(g)B.(d)C.cD.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?!?4〕廣義表((a,b,c,d))的表頭是〔〕,表尾是〔〕。A.a(chǎn)B.()C.(a,b,c,d)D.(b,c,d)答案:C、B解釋:表頭為非空廣義表的第一個(gè)元素,可以是一個(gè)單原子,也可以是一個(gè)子表,((a,b,c,d))的表頭為一個(gè)子表(a,b,c,d);表尾為除去表頭之外,由其余元素構(gòu)成的表,表為一定是個(gè)廣義表,((a,b,c,d))的表尾為空表()。〔15〕設(shè)廣義表 L=((a,b,c)),那么L的長(zhǎng)度和深度分別為〔〕。A.1和1B.1和3C.1和2D.2和3答案:Cword文檔精品文檔分享28word文檔精品文檔分享解釋:廣義表的深度是指廣義表中展開后所含括號(hào)的層數(shù),廣義表的長(zhǎng)度是指廣義表中所含元素的個(gè)數(shù)。根據(jù)定義易知L的長(zhǎng)度為 1,深度為2。2.應(yīng)用題〔1〕模式串t=‘a(chǎn)bcaabbabcab’寫出用KMP法求得的每個(gè)字符對(duì)應(yīng)的next和nextval函數(shù)值。答案:模式串t的next和nextval值如下:j123456789101112t串a(chǎn)bcaabbabcabnext[j]011122312345nextval[j]011021301105〔2〕設(shè)目標(biāo)為 t=“abcaabbabcabaacbacba〞,模式為p=“abcabaa〞①計(jì)算模式p的naxtval函數(shù)值;②不寫出算法,只畫出利用KMP算法進(jìn)展模式匹配時(shí)每一趟的匹配過程。答案:①p的nextval函數(shù)值為0110132。〔p的next函數(shù)值為0111232〕。②利用KMP(改良的nextval)算法,每趟匹配過程如下:第一趟匹配:abcaabbabcabaacbacbaabcab(i=5,j=5)第二趟匹配:abcaabbabcabaacbacbaabc(i=7,j=3)第三趟匹配:abcaabbabcabaacbacbaa(i=7,j=1)第四趟匹配:abcaabbabcabaacbacba(成功)abcabaa(i=15,j=8)〔3〕數(shù)組 A中,每個(gè)元素 A[i,j]的長(zhǎng)度均為32個(gè)二進(jìn)位 ,行下標(biāo)從 -1到9,列下標(biāo)從 1到11,從首地址 S開場(chǎng)連續(xù)存放主存儲(chǔ)器中,主存儲(chǔ)器字長(zhǎng)為16位。求:①存放該數(shù)組所需多少單元?②存放數(shù)組第4列所有元素至少需多少單元?③數(shù)組按行存放時(shí),元素A[7,4]的起始地址是多少?④數(shù)組按列存放時(shí),元素A[4,7]的起始地址是多少?答案:每個(gè)元素 32個(gè)二進(jìn)制位,主存字長(zhǎng)16位,故每個(gè)元素占2個(gè)字長(zhǎng),行下標(biāo)可平移至1到11。〔1〕242〔2〕22〔3〕s+182〔4〕s+142word文檔精品文檔分享29word文檔精品文檔分享(4)請(qǐng)將香蕉banana用工具H()—Head(),T()—Tail()從L中取出。L=(apple,(orange,(strawberry,(banana)),peach),pear)答案:H〔H〔T〔H〔T〔H〔T〔L〕〕〕〕〕〕〕3.算法設(shè)計(jì)題〔1〕寫一個(gè)算法統(tǒng)計(jì)在輸入字符串中各個(gè)不同字符出現(xiàn)的頻度并將結(jié)果存入文件〔字符串中的合法字符為A-Z這26個(gè)字母和 0-9這10個(gè)數(shù)字〕。[題目分析 ]由于字母共 26個(gè),加上數(shù)字符號(hào)10個(gè)共 36個(gè),所以設(shè)一長(zhǎng)36的整型數(shù)組,前10個(gè)分量存放數(shù)字字符出現(xiàn)的次數(shù),余下存放字母出現(xiàn)的次數(shù)。從字符串中讀出數(shù)字字符時(shí),字符的ASCII代碼值減去數(shù)字字符‘0’的ASCII代碼值,得出其數(shù)值(0..9),字母的ASCII代碼值減去字符‘A’的ASCII代碼值加上10,存入其數(shù)組的對(duì)應(yīng)下標(biāo)分量中。遇其它符號(hào)不作處理,直至輸入字符串完畢。[算法描述 ]voidCount〔〕統(tǒng)計(jì)輸入字符串中數(shù)字字符和字母字符的個(gè)數(shù)。{inti,num[36];charch;for〔i=0;i<36;i++〕num[i]=0;//初始化while〔〔ch=getchar〔〕〕!=‘#’〕//‘#’表示輸入字符串完畢。if〔‘0’<=ch<=‘9’〕{i=ch-48;num[i]++;}//數(shù)字字符elseif〔‘A’<=ch<=‘Z’〕{i=ch-65+10;num[i]++;}//字母字符for〔i=0;i<10;i++〕 //輸出數(shù)字字符的個(gè)數(shù)cout<<“數(shù)字〞 <<i<<“的個(gè)數(shù)=〞<<num[i]<<endl;for〔i=10;i<36;i++〕//求出字母字符的個(gè)數(shù)cout<<“字母字符〞 <<i+55<<“的個(gè)數(shù)=〞<<num[i]<<endl;}〔2〕寫一個(gè)遞歸算法來實(shí)現(xiàn)字符串逆序存儲(chǔ),要求不另設(shè)串存儲(chǔ)空間。[題目分析 ]實(shí)現(xiàn)字符串的逆置并不難,但此題“要求不另設(shè)串存儲(chǔ)空間〞來實(shí)現(xiàn)字符串逆序存儲(chǔ),即第一個(gè)輸入的字符最后存儲(chǔ),最后輸入的字符先存儲(chǔ),使用遞歸可容易做到。[算法描述 ]void InvertStore(char A[])字符串逆序存儲(chǔ)的遞歸算法。{char ch;staticint i=0;//需要使用靜態(tài)變量cin>>ch;if(ch!='.') //規(guī)定'.'是字符串輸入完畢標(biāo)志word文檔精品文檔分享30word文檔精品文檔分享{InvertStore(A);A[i++]=ch;//字符串逆序存儲(chǔ)}A[i]='\0';//字符串結(jié)尾標(biāo)記}〔3〕編寫算法,實(shí)現(xiàn)下面函數(shù)的功能。函數(shù)voidinsert(char*s,char*t,intpos)將字符串t插入到字符串s中,插入位置為pos。假設(shè)分配給字符串s的空間足夠讓字符串t插入。〔說明:不得使用任何庫函數(shù)〕[題目分析 ]此題是字符串的插入問題,要求在字符串s的pos位置,插入字符串t。首先應(yīng)查找字符串s的pos位置,將第pos個(gè)字符到字符串s尾的子串向后移動(dòng)字符串t的長(zhǎng)度,然后將字符串t復(fù)制到字符串s的第pos位置后。對(duì)插入位置pos要驗(yàn)證其合法性,小于1或大于串 s的長(zhǎng)度均為非法,因題目假設(shè)給字符串s的空間足夠大,故對(duì)插入不必判溢出。[算法描述 ]voidinsert(char*s,char*t,intpos)//將字符串 t插入字符串s的第pos個(gè)位置。{inti=1,x=0;char*p=s,*q=t;//p,q分別為字符串s和t的工作指針if(pos<1){cout<<“pos參數(shù)位置非法〞<<endl;exit(0);}while(*p!=’0’&&i<pos){p++;i++;}//查pos位置//假設(shè)pos小于串 s長(zhǎng)度,那么查到pos位置時(shí),i=pos。if(*p=='/0'){cout<<pos<<"位置大于字符串s的長(zhǎng)度";exit(0);}else//查找字符串的尾while(*p!='/0'){p++; i++;}//查到尾時(shí),i為字符‘\0’的下標(biāo),p也指向‘\0’。while(*q!='\0'){q++; x++; } //查找字符串t的長(zhǎng)度 x,循環(huán)完畢時(shí)q指向'\0'。for(j=i;j>=pos;j--){*(p+x)=*p;p--;}//串s的pos后的子串右移,空出串t的位置。q--;//指針q回退到串 t的最后一個(gè)字符for(j=1;j<=x;j++)*p--=*q--;//將t串插入到s的pos位置上[算法討論 ]串s的完畢標(biāo)記('\0')也后移了,而串t的結(jié)尾標(biāo)記不應(yīng)插入到s中?!?〕字符串S1中存放一段英文,寫出算法format(s1,s2,s3,n),將其按給定的長(zhǎng)度n格式化成兩端對(duì)齊的字符串S2,其多余的字符送S3。[題目分析 ]此題要求字符串s1拆分成字符串s2和字符串 s3,要求字符串s2“按給定長(zhǎng)度n格式化成兩端對(duì)齊的字符串〞,即長(zhǎng)度為n且首尾字符不得為空格字符。算法從左到右掃描字符串s1,找到第一個(gè)非空格字符,計(jì)數(shù)到n,第n個(gè)拷入字符串s2的字符不得為空格,然后將余下字符復(fù)制到字符串s3中。[算法描述 ]word文檔精品文檔分享31word文檔精品文檔分享voidformat(char*s1,*s2,*s3)//將字符串 s1拆分成字符串s2和字符串 s3,要求字符串s2是長(zhǎng) n且兩端對(duì)齊{char*p=s1,*q=s2;inti=0;while(*p!='\0'&&*p=='')p++;//濾掉s1左端空格if(*p=='\0'){cout<<"字符串s1為空串或空格串"<<endl;exit(0);}while(*p!='\0'&&i<n){*q=*p;q++;p++;i++;}字符串s1向字符串s2中復(fù)制if(*p=='\0'){cout<<"字符串s1沒有"<<n<<"個(gè)有效字符"<<endl;exit(0);}if(*(--q)=='')//假設(shè)最后一個(gè)字符為空格,那么需向后找到第一個(gè)非空格字符{p--;//p指針也后退while(*p==''&&*p!='\0')p++;//往后查找一個(gè)非空格字符作串s2的尾字符if(*p=='\0'){cout<<"s1串沒有"<<n<<"個(gè)兩端對(duì)齊的字符串"<<endl;exit(0);}*q=*p;//字符串s2最后一個(gè)非空字符*(++q)='\0'; //置s2字符串完畢標(biāo)記}*q=s3;p++;//將s1串其余局部送字符串s3。while(*p!='\0'){*q=*p;q++;p++;}*q='\0';//置串s3完畢標(biāo)記}〔5〕設(shè)二維數(shù)組a[1..m,1..n]含有m*n個(gè)整數(shù)。①寫一個(gè)算法判斷a中所有元素是否互不一樣?輸出相關(guān)信息 (yes/no);②試分析算法的時(shí)間復(fù)雜度。①[題目分析 ]判斷二維數(shù)組中元素是否互不一樣,只有逐個(gè)比擬,找到一對(duì)相等的元素,就可結(jié)論為不是互不一樣。如何到達(dá)每個(gè)元素同其它元素比擬一次且只一次?在當(dāng)前行,每個(gè)元素要同本行后面的元素比擬一次〔下面第一個(gè)循環(huán)控制變量p的for循環(huán)〕,然后同第i+1行及以后各行元素比擬一次,這就是循環(huán)控制變量k和p的二層 for循環(huán)。[算法描述 ]intJudgEqual(inga[m][n],intm,n)//判斷二維數(shù)組中所有元素是否互不一樣,如是,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度紡織原材料進(jìn)出口代理服務(wù)協(xié)議2篇
- 2025年度個(gè)人二手車翻新與交易合同模板2篇
- 2025版?zhèn)€人房產(chǎn)購(gòu)買定金協(xié)議3篇
- 教育科技如何改變家庭教學(xué)環(huán)境
- 2025年水泥行業(yè)智能制造承包工程合同4篇
- 小學(xué)數(shù)學(xué)與計(jì)算機(jī)編程培養(yǎng)邏輯思維的新途徑
- 2025年個(gè)人購(gòu)房合同(含智能家居升級(jí)服務(wù))
- 教學(xué)反思與教師專業(yè)成長(zhǎng)的關(guān)系研究
- 科技產(chǎn)業(yè)變革的挑戰(zhàn)與市場(chǎng)機(jī)遇分析
- 移動(dòng)端安全教育軟件的現(xiàn)狀與發(fā)展趨勢(shì)分析
- 2023年管理學(xué)原理考試題庫附答案
- 【可行性報(bào)告】2023年電動(dòng)自行車相關(guān)項(xiàng)目可行性研究報(bào)告
- 歐洲食品與飲料行業(yè)數(shù)據(jù)與趨勢(shì)
- 放療科室規(guī)章制度(二篇)
- 中高職貫通培養(yǎng)三二分段(中職階段)新能源汽車檢測(cè)與維修專業(yè)課程體系
- 浙江省安全員C證考試題庫及答案(推薦)
- 目視講義.的知識(shí)
- 洗衣機(jī)事業(yè)部精益降本總結(jié)及規(guī)劃 -美的集團(tuán)制造年會(huì)
- 房地產(chǎn)公司流動(dòng)資產(chǎn)管理制度
- 2015-2022年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招語文/數(shù)學(xué)/英語筆試參考題庫含答案解析
- 鋁合金門窗設(shè)計(jì)說明
評(píng)論
0/150
提交評(píng)論