數(shù)據(jù)結(jié)構(gòu)[C語言版]第三四章習(xí)題答案及解析

上傳人:仙*** 文檔編號:90267190 上傳時(shí)間:2022-05-14 格式:DOC 頁數(shù):15 大小:87KB
收藏 版權(quán)申訴 舉報(bào) 下載
數(shù)據(jù)結(jié)構(gòu)[C語言版]第三四章習(xí)題答案及解析_第1頁
第1頁 / 共15頁
數(shù)據(jù)結(jié)構(gòu)[C語言版]第三四章習(xí)題答案及解析_第2頁
第2頁 / 共15頁
數(shù)據(jù)結(jié)構(gòu)[C語言版]第三四章習(xí)題答案及解析_第3頁
第3頁 / 共15頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《數(shù)據(jù)結(jié)構(gòu)[C語言版]第三四章習(xí)題答案及解析》由會員分享,可在線閱讀,更多相關(guān)《數(shù)據(jù)結(jié)構(gòu)[C語言版]第三四章習(xí)題答案及解析(15頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。

1、. 第3章 棧和隊(duì)列 習(xí)題 1.選擇題 〔1若讓元素1,2,3,4,5依次進(jìn)棧,則出棧次序不可能出現(xiàn)在〔 種情況。 A.5,4,3,2,1 B.2,1,5,4,3 C.4,3,1,2,5 D.2,3,5,4,1 〔2若已知一個(gè)棧的入棧序列是1,2,3,…,n,其輸出序列為p1,p2,p3,…,pn,若p1=n,則pi為〔 。 A.i B.n-i C.n-i+1 D.不確定 〔3數(shù)組Q[n]用來表示一個(gè)循環(huán)隊(duì)列,f為當(dāng)前隊(duì)列頭元素的前一位置,r?yàn)殛?duì)尾元素的位置,假定隊(duì)列中元素的個(gè)數(shù)

2、小于n,計(jì)算隊(duì)列中元素個(gè)數(shù)的公式為〔 。 A.r-f B.%n C.n+r-f D.〔n+r-f>%n 〔4鏈?zhǔn)綏=Y(jié)點(diǎn)為:,top指向棧頂.若想摘除棧頂結(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; 〔5設(shè)有一個(gè)遞歸算法如下 int fact { //n大

3、于等于0 if return 1; else return n*fact; } 則計(jì)算fact需要調(diào)用該函數(shù)的次數(shù)為〔。 A.n+1B.n-1C. nD. n+2 〔6棧在〔中有所應(yīng)用。 A.遞歸調(diào)用B.函數(shù)調(diào)用C.表達(dá)式求值D.前三個(gè)選項(xiàng)都有 〔7為解決計(jì)算機(jī)主機(jī)與打印機(jī)間速度不匹配問題,通常設(shè)一個(gè)打印數(shù)據(jù)緩沖區(qū)。主機(jī)將要輸出的數(shù)據(jù)依次寫入該緩沖區(qū),而打印機(jī)則依次從該緩沖區(qū)中取出數(shù)據(jù)。該緩沖區(qū)的邏輯結(jié)構(gòu)應(yīng)該是〔。 A.隊(duì)列 B.棧 C. 線性表 D.有序表 〔8設(shè)棧S和隊(duì)列Q的初始狀態(tài)為空,元素

4、e1、e2、e3、e4、e5和e6依次進(jìn)入棧S,一個(gè)元素出棧后即進(jìn)入Q,若6個(gè)元素出隊(duì)的序列是e2、e4、e3、e6、e5和e1,則棧S的容量至少應(yīng)該是〔 。 A.2 B.3 C.4 D. 6 〔9在一個(gè)具有n個(gè)單元的順序棧中,假設(shè)以地址高端作為棧底,以top作為棧頂指針,則當(dāng)作進(jìn)棧處理時(shí),top的變化為〔 。 A.top不變 B.top=0 C.top-- D.top++ 〔10設(shè)計(jì)一個(gè)判別表達(dá)式中左,右括號是否配對出現(xiàn)的算法,采用〔 數(shù)據(jù)結(jié)構(gòu)最佳。 A.線性表的順序存儲結(jié)構(gòu)B.隊(duì)列 C

5、. 線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu) D. 棧 〔11用鏈接方式存儲的隊(duì)列,在進(jìn)行刪除運(yùn)算時(shí)〔 。 A. 僅修改頭指針 B. 僅修改尾指針 C. 頭、尾指針都要修改 D. 頭、尾指針可能都要修改 〔12循環(huán)隊(duì)列存儲在數(shù)組A[0..m]中,則入隊(duì)時(shí)的操作為〔 。 A. rear=rear+1 B. rear=% C. rear=%m D. rear=% 〔13最大容量為n的循環(huán)隊(duì)列,隊(duì)尾指針是rear,隊(duì)頭是front,則隊(duì)空的條件是〔 

6、。 A. %n==front B. rear==front C.rear+1==front D. %n==front 〔14棧和隊(duì)列的共同點(diǎn)是〔 。 A. 都是先進(jìn)先出 B. 都是先進(jìn)后出 C. 只允許在端點(diǎn)處插入和刪除元素 D. 沒有共同點(diǎn) 〔15一個(gè)遞歸算法必須包括〔 。 A. 遞歸部分B. 終止條件和遞歸部分 C. 迭代部分 D. 終止條件和迭代部分 〔2回文是指正讀反讀均相同的字符序列,如"abba"和"abdb

7、a"均是回文,但"good"不是回文。試寫一個(gè)算法判定給定的字符向量是否為回文。<提示:將一半字符入棧>? 根據(jù)提示,算法可設(shè)計(jì)為:  //以下為順序棧的存儲結(jié)構(gòu)定義  #define StackSize 100 //假定預(yù)分配的??臻g最多為100個(gè)元素  typedef char DataType;//假定棧元素的數(shù)據(jù)類型為字符  typedef struct{   DataType data[StackSize];   int top;  }SeqStack;?  int IsHuiwen< char *t>   {//判斷t字符向量是否為回文,若是,返回1,否則返

8、回0    SeqStack s;    int i , len;    char temp;    InitStack< &s>;    len=strlen; //求向量長度    for < i=0; i//將一半字符入棧     Push< &s, t[i]>;    while< !EmptyStack< &s>>     {// 每彈出一個(gè)字符與相應(yīng)字符比較      temp=Pop <&s>;      if< temp!=S[i]>? return 0 ;// 不等則返回0      else i++;     }?

9、   return 1 ; // 比較完畢均相等則返回 1   } 〔3設(shè)從鍵盤輸入一整數(shù)的序列:a1, a2, a3,…,an,試編寫算法實(shí)現(xiàn):用棧結(jié)構(gòu)存儲輸入的整數(shù),當(dāng)ai≠-1時(shí),將ai進(jìn)棧;當(dāng)ai=-1時(shí),輸出棧頂整數(shù)并出棧。算法應(yīng)對異常情況〔入棧滿等給出相應(yīng)的信息。 #define maxsize ??臻g容量 void InOutS //s是元素為整數(shù)的棧,本算法進(jìn)行入棧和退棧操作。 {int top=0; //top為棧頂指針,定義top=0時(shí)為??铡? for

10、 //n個(gè)整數(shù)序列作處理。 {scanf<"%d",&x>; //從鍵盤讀入整數(shù)序列。 if // 讀入的整數(shù)不等于-1時(shí)入棧。 if{printf<"棧滿\n">;exit<0>;}else s[++top]=x; //x入棧。 else //讀入的整數(shù)等于-1時(shí)退棧。 {if{printf<"??誠n">;exit<0>;} else printf<"出棧元素是%d\n",s[top--]>;}} }//算法結(jié)束。 〔4從鍵盤上輸入一個(gè)后綴表達(dá)式,試

11、編寫算法計(jì)算表達(dá)式的值。規(guī)定:逆波蘭表達(dá)式的長度不超過一行,以$符作為輸入結(jié)束,操作數(shù)之間用空格分隔,操作符只可能有+、-、*、/四種運(yùn)算。例如:234 34+2*$。 [題目分析]逆波蘭表達(dá)式<即后綴表達(dá)式>求值規(guī)則如下:設(shè)立運(yùn)算數(shù)棧OPND,對表達(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á)式結(jié)束符$,這時(shí)OPND棧中只有一個(gè)數(shù),就是結(jié)果。 float expr< > //從鍵盤輸入逆波蘭表達(dá)式,以‘$’表示輸入結(jié)束,本算法求逆波蘭式表達(dá)式的值。 {float

12、OPND[30]; // OPND是操作數(shù)棧。 init; //兩棧初始化。 float num=0.0; //數(shù)字初始化。 scanf <"%c",&x>;//x是字符型變量。 while {switch {case‘0’<=x<=’9’:while<=’0’&&x<=’9’>||x==’.’> //拼數(shù) if //處理整數(shù) {num=num*10+〔ord-ord<‘0’>; scanf<"%c",&x>;} else //處理小數(shù)部分。

13、 {scale=10.0; scanf<"%c",&x>; while=’0’&&x<=’9’> {num=num+-ord<‘0’>/scale; scale=scale*10; scanf<"%c",&x>; } }//else push; num=0.

14、0;//數(shù)壓入棧,下個(gè)數(shù)初始化 case x=‘ ’:break; //遇空格,繼續(xù)讀下一個(gè)字符。 case x=‘+’:push+pop>;break; case x=‘-’:x1=pop;x2=pop;push;break; case x=‘*’:push*pop>;break; case x=‘/’:x1=pop;x2=pop;push;break; default: //其它符號不作

15、處理。 }//結(jié)束switch scanf<"%c",&x>;//讀入表達(dá)式中下一個(gè)字符。 }//結(jié)束while〔x!=‘$’ printf<"后綴表達(dá)式的值為%f",pop>; }//算法結(jié)束。 [算法討論]假設(shè)輸入的后綴表達(dá)式是正確的,未作錯(cuò)誤檢查。算法中拼數(shù)部分是核心。若遇到大于等于‘0’且小于等于‘9’的字符,認(rèn)為是數(shù)。這種字符的序號減去字符‘0’的序號得出數(shù)。對于整數(shù),每讀入一個(gè)數(shù)字字符,前面得到的部分?jǐn)?shù)要乘上10再加新讀入的數(shù)得到新的部分?jǐn)?shù)。當(dāng)讀到小數(shù)點(diǎn),認(rèn)為數(shù)的整數(shù)部分已完,要接著處理小數(shù)部分。小數(shù)部分的數(shù)要除以10〔或10的

16、冪數(shù)變成十分位,百分位,千分位數(shù)等等,與前面部分?jǐn)?shù)相加。在拼數(shù)過程中,若遇非數(shù)字字符,表示數(shù)已拼完,將數(shù)壓入棧中,并且將變量num恢復(fù)為0,準(zhǔn)備下一個(gè)數(shù)。這時(shí)對新讀入的字符進(jìn)入‘+’、‘-’、‘*’、‘/’及空格的判斷,因此在結(jié)束處理數(shù)字字符的case后,不能加入break語句。 〔5假設(shè)以I和O分別表示入棧和出棧操作。棧的初態(tài)和終態(tài)均為空,入棧和出棧的操作序列可表示為僅由I和O組成的序列,稱可以操作的序列為合法序列,否則稱為非法序列。 ①下面所示的序列中哪些是合法的? A. IOIIOIOO B. IOOIOIIO C. IIIOIOIO D. IIIO

17、OIOO ②通過對①的分析,寫出一個(gè)算法,判定所給的操作序列是否合法。若合法,返回true,否則返回false〔假定被判定的操作序列已存入一維數(shù)組中。 ①A和D是合法序列,B和C 是非法序列。 ②設(shè)被判定的操作序列已存入一維數(shù)組A中。 int Judge //判斷字符數(shù)組A中的輸入輸出序列是否是合法序列。如是,返回true,否則返回false。 {i=0; //i為下標(biāo)。 j=k=0; //j和k分別為I和字母O的的個(gè)數(shù)。 while

18、’> //當(dāng)未到字符數(shù)組尾就作。 {switch {case‘I’: j++; break; //入棧次數(shù)增1。 case‘O’: k++; ifj>{printf<"序列非法\n">;exit<0>;} } i++; //不論A[i]是‘I’或‘O’,指針i均后移。} if {printf<"序列非法\n">;return;} else {printf<"序列合法\n">;return;} }//算法結(jié)束。 [算法討論

19、]在入棧出棧序列〔即由‘I’和‘O’組成的字符串的任一位置,入棧次數(shù)〔‘I’的個(gè)數(shù)都必須大于等于出棧次數(shù)〔即‘O’的個(gè)數(shù),否則視作非法序列,立即給出信息,退出算法。整個(gè)序列〔即讀到字符數(shù)組中字符串的結(jié)束標(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ì)結(jié)構(gòu):  typedef struct queuenode{    Datatype data;    struct qu

20、euenode *next;   }QueueNode; //以上是結(jié)點(diǎn)類型的定義  typedef struct{    queuenode *rear;   }LinkQueue; //只設(shè)一個(gè)指向隊(duì)尾元素的指針  <1>置空隊(duì)   void InitQueue< LinkQueue *Q>    { //置空隊(duì):就是使頭結(jié)點(diǎn)成為隊(duì)尾元素     QueueNode *s;     Q->rear = Q->rear->next;//將隊(duì)尾指針指向頭結(jié)點(diǎn)     while rear!=Q->rear->next>//當(dāng)隊(duì)列非空,將隊(duì)中元素逐個(gè)出隊(duì)  

21、    {s=Q->rear->next;       Q->rear->next=s->next;       free;      }//回收結(jié)點(diǎn)空間    }  <2>判隊(duì)空?   int EmptyQueue< LinkQueue *Q>    { //判隊(duì)空     //當(dāng)頭結(jié)點(diǎn)的next指針指向自己時(shí)為空隊(duì)     return Q->rear->next->next==Q->rear->next;    }  <3>入隊(duì)   void EnQueue< LinkQueue *Q, Datatype x>    { //入隊(duì)     //也

22、就是在尾結(jié)點(diǎn)處插入元素     QueueNode *p= malloc >;//申請新結(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ì)   Datatype DeQueue< LinkQueue *Q>    {//出隊(duì),把頭結(jié)點(diǎn)之后的元素摘下     Datatype t;     QueueNode *p;     if

23、Queue< Q >>       Error<"Queue underflow">;     p=Q->rear->next->next; //p指向?qū)⒁碌慕Y(jié)點(diǎn)     x=p->data; //保存結(jié)點(diǎn)中數(shù)據(jù)     if 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;}     else?       Q->rear->next->next=p->next;//摘下結(jié)點(diǎn)p     free

;//釋放

24、被刪結(jié)點(diǎn)     return x;    } 〔7假設(shè)以數(shù)組Q[m]存放循環(huán)隊(duì)列中的元素, 同時(shí)設(shè)置一個(gè)標(biāo)志tag,以tag== 0和tag == 1來區(qū)別在隊(duì)頭指針和隊(duì)尾指針相等時(shí),隊(duì)列狀態(tài)為"空"還是"滿"。試編寫與此結(jié)構(gòu)相應(yīng)的插入和刪除算法。 [解答] 循環(huán)隊(duì)列類定義 #include template classQueue { //循環(huán)隊(duì)列的類定義 public: Queue ; ~Queue < > { del

25、ete [ ] Q;} void EnQueue ; Type DeQueue <>; TypeGetFront < >; void MakeEmpty < >{ front = rear = tag = 0;} //置空隊(duì)列 intIsEmpty < >const{ return front == rear && tag == 0;} //判隊(duì)列空否 intIsFull < >const{ return front == rear && tag == 1;} //判隊(duì)列滿否 private: intrear, front, tag;

26、//隊(duì)尾指針、隊(duì)頭指針和隊(duì)滿標(biāo)志 Type *Q; //存放隊(duì)列元素的數(shù)組 intm; //隊(duì)列最大可容納元素個(gè)數(shù) } 構(gòu)造函數(shù) template Queue:: Queue < intsz > : rear <0>,front <0>, tag<0>, m { //建立一個(gè)最大具有m個(gè)元素的空隊(duì)列。 Q =new Type[m]; //創(chuàng)建隊(duì)列空間 assert < Q != 0 >; //斷言:動態(tài)存儲分配成功與否 } 插入函數(shù) template

27、> voidQueue ::EnQueue < Type &item> { assert < ! IsFull < > >;//判隊(duì)列是否不滿,滿則出錯(cuò)處理 rear = < rear + 1 > % m;//隊(duì)尾位置進(jìn)1, 隊(duì)尾指針指示實(shí)際隊(duì)尾位置 Q[rear] = item; //進(jìn)隊(duì)列 tag = 1; //標(biāo)志改1,表示隊(duì)列不空 } 刪除函數(shù) template Type Queue ::DeQueue < > { assert < ! IsEmpty < > >;//判斷隊(duì)列是否不

28、空,空則出錯(cuò)處理 front =< front + 1 > % m; //隊(duì)頭位置進(jìn)1, 隊(duì)頭指針指示實(shí)際隊(duì)頭的前一位置 tag = 0; //標(biāo)志改0, 表示棧不滿 return Q[front]; //返回原隊(duì)頭元素的值 } 讀取隊(duì)頭元素函數(shù) template Type Queue ::GetFront < > { assert < ! IsEmpty < > >;//判斷隊(duì)列是否不空,空則出錯(cuò)處理 return Q[ % m]; //返回隊(duì)頭元素的值 } <8如果允許在循

29、環(huán)隊(duì)列的兩端都可以進(jìn)行插入和刪除操作。要求: ① 寫出循環(huán)隊(duì)列的類型定義; ② 寫出"從隊(duì)尾刪除"和"從隊(duì)頭插入"的算法。 [題目分析] 用一維數(shù)組 v[0..M-1]實(shí)現(xiàn)循環(huán)隊(duì)列,其中M是隊(duì)列長度。設(shè)隊(duì)頭指針 front和隊(duì)尾指針rear,約定front指向隊(duì)頭元素的前一位置,rear指向隊(duì)尾元素。定義front=rear時(shí)為隊(duì)空,%m=front 為隊(duì)滿。約定隊(duì)頭端入隊(duì)向下標(biāo)小的方向發(fā)展,隊(duì)尾端入隊(duì)向下標(biāo)大的方向發(fā)展。 〔1#define M 隊(duì)列可能達(dá)到的最大長度 typedefstruct { elemtp data[M]; int front,re

30、ar; } cycqueue; 〔2elemtp delqueue < cycqueue Q> //Q是如上定義的循環(huán)隊(duì)列,本算法實(shí)現(xiàn)從隊(duì)尾刪除,若刪除成功,返回被刪除元素,否則給出出錯(cuò)信息。 { if {printf<"隊(duì)列空">; exit<0>;} Q.rear=%M; //修改隊(duì)尾指針。 return%M]>; //返回出隊(duì)元素。 }//從隊(duì)尾刪除算法結(jié)束 void enqueue

31、// Q是順序存儲的循環(huán)隊(duì)列,本算法實(shí)現(xiàn)"從隊(duì)頭插入"元素x。 {if %M> {printf<"隊(duì)滿"; exit<0>;> Q.data[Q.front]=x; //x 入隊(duì)列 Q.front=%M; //修改隊(duì)頭指針。 }// 結(jié)束從隊(duì)頭插入算法。 〔9已知Ackermann函數(shù)定義如下: ① 寫出計(jì)算Ack的遞歸算法,并根據(jù)此算法給出出Ack<2,1>的計(jì)算過程。 ② 寫出計(jì)算Ack的非遞歸算法。 int Ack {if

32、0> return; elseif return>; elsereturn>; }//算法結(jié)束 〔1Ack<2,1>的計(jì)算過程 Ack<2,1>=Ack<1,Ack<2,0>> //因m<>0,n<>0而得 =Ack<1,Ack<1,1>> //因m<>0,n=0而得 =Ack<1,Ack<0,Ack<1,0>>> // 因m<>0,n<>0而得

33、 = 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>>

34、>> //因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而得 〔2int Ackerman< int m,

35、 int n> {int akm[M][N];int i,j; for akm[0][j];=j+1; for {akm[i][0]=akm[i-1][1]; for akm[i][j]=akm[i-1][akm[i][j-1]]; } return; }//算法結(jié)束 〔10已知f為單鏈表的表頭指針, 鏈表中存儲的都是整型數(shù)據(jù),試寫出實(shí)現(xiàn)下列運(yùn)算的遞歸算法: ①求鏈表中的最大整

36、數(shù); ②求鏈表的結(jié)點(diǎn)個(gè)數(shù); ③ 求所有整數(shù)的平均值。 #include //定義在頭文件"RecurveList.h"中 class List; classListNode { //鏈表結(jié)點(diǎn)類 friend classList; private: intdata; //結(jié)點(diǎn)數(shù)據(jù) ListNode *link; //結(jié)點(diǎn)指針 ListNode < const intitem > : data, link { } //構(gòu)造函數(shù) }; class List { //鏈表類 priv

37、ate: ListNode *first, current; intMax; int Num; floatAvg ; public: List < > :first, current { } //構(gòu)造函數(shù) ~List<>{ } //析構(gòu)函數(shù) ListNode* NewNode < const intitem >; //創(chuàng)建鏈表結(jié)點(diǎn), 其值為item voidNewList < const intretvalue >; //建立鏈表, 以輸入ret

38、value結(jié)束 voidPrintList < >; //輸出鏈表所有結(jié)點(diǎn)數(shù)據(jù) intGetMax < > { return Max < first >; } //求鏈表所有數(shù)據(jù)的最大值 int GetNum < > { returnNum < first >; } //求鏈表中數(shù)據(jù)個(gè)數(shù) float GetAvg < > { return Avg < first >; } //求鏈表所有數(shù)據(jù)的平均值 }; ListNode* List::NewNode < const int item > { //創(chuàng)建新鏈表結(jié)點(diǎn) ListNode *newnode = new

39、 ListNode ; returnnewnode; } voidList::NewList{ //建立鏈表, 以輸入retvalue結(jié)束 first=NULL;intvalue;ListNode *q; cout<<"Input your data:\n"; //提示 cin >> value; //輸入 while< value != retvalue>{//輸入有效 q=NewNode; //建立包含value的新結(jié)點(diǎn) if < first == NULL > first =

40、current = q; //空表時(shí), 新結(jié)點(diǎn)成為鏈表第一個(gè)結(jié)點(diǎn) else {current->link= q;current = q; } //非空表時(shí), 新結(jié)點(diǎn)鏈入鏈尾 cin >> value; //再輸入 } current->link = NULL; //鏈尾封閉 } voidList::PrintList<>{ //輸出鏈表 cout<<"\nThe List is:\n"; ListNode *p = first; while{ cout<data<<' ';p=p->link;} cout << ‘

41、\n’; } intList::Max{ //遞歸算法 : 求鏈表中的最大值 iflink==NULL>returnf->data; //遞歸結(jié)束條件 inttemp=Maxlink>; //在當(dāng)前結(jié)點(diǎn)的后繼鏈表中求最大值 ifdata>temp>returnf->data; //如果當(dāng)前結(jié)點(diǎn)的值還要大, 返回當(dāng)前檢點(diǎn)值 else returntemp; //否則返回后繼鏈表中的最大值 } intList ::Num < ListNode *f > { //遞歸算法:求鏈表中結(jié)點(diǎn)個(gè)數(shù)

42、 if < f == NULL > return 0; //空表, 返回0 return 1+ Num < f ->link >; //否則, 返回后繼鏈表結(jié)點(diǎn)個(gè)數(shù)加1 } floatList ::Avg < ListNode *f, int&n>{//遞歸算法 : 求鏈表中所有元素的平均值 if < f ->link == NULL > //鏈表中只有一個(gè)結(jié)點(diǎn), 遞歸結(jié)束條件 {n = 1; return< float > data >; } else { float Sum =Avg link, n> * n;n++;retur

43、n < f->data+Sum > / n; } } #include "RecurveList.h" //定義在主文件中 intmain < int argc, char* argv[ ] > { List test; intfinished; cout << "輸入建表結(jié)束標(biāo)志數(shù)據(jù) :"; cin >> finished; //輸入建表結(jié)束標(biāo)志數(shù)據(jù) test.NewList< finished>; //建立鏈表 test.PrintList < >; //打印鏈表 cout << "\nThe Max is : " << te

44、st.GetMax < >; cout << "\nThe Num is : " << test.GetNum < >; cout << "\nThe Ave is : " << test.GetAve <> << '\n'; printf < "Hello World!\n" >; return 0; } 第4章 串、數(shù)組和廣義表 習(xí)題 1.選擇題 〔1串是一種特殊的線性表,其特殊性體現(xiàn)在〔 。 A.可以順序存儲 B.?dāng)?shù)據(jù)元素是一個(gè)字符 C.可以鏈?zhǔn)酱鎯? D.?dāng)?shù)據(jù)元素可以是多個(gè)字符若 〔2串

45、下面關(guān)于串的的敘述中,〔 是不正確的? A.串是字符的有限序列 B.空串是由空格構(gòu)成的串 C.模式匹配是串的一種重要運(yùn)算 D.串既可以采用順序存儲,也可以采用鏈?zhǔn)酱鎯? 〔3串"ababaaababaa"的next數(shù)組為〔 。 〔4串"ababaabab"的nextval為〔 。 A.010104101 B.010102101C.010100011 D.010101011 〔5串的長度是指〔 。 A.串中所含不同字母的個(gè)數(shù) B.串中所含字符的個(gè)數(shù) C.串中所含不同字符的個(gè)數(shù) D.串中所含非空格字符的個(gè)數(shù) 〔6假設(shè)以行序?yàn)橹餍虼?/p>

46、儲二維數(shù)組A=array[1..100,1..100],設(shè)每個(gè)數(shù)據(jù)元素占2個(gè)存儲單元,基地址為10,則LOC[5,5]=〔 。 A.808 B.818 C.1010 D.1020 〔7設(shè)有數(shù)組A[i,j],數(shù)組的每個(gè)元素長度為3字節(jié),i的值為1到8,j的值為1到10,數(shù)組從內(nèi)存首地址BA開始順序存放,當(dāng)用以列為主存放時(shí),元素A[5,8]的存儲首地址為〔 。 A.BA+141 B.BA+180 C.BA+222 D.BA+225 〔8設(shè)有一個(gè)10階的對稱矩陣A,采用壓縮存儲方式,

47、以行序?yàn)橹鞔鎯?a11為第一元素,其存儲地址為1,每個(gè)元素占一個(gè)地址空間,則a85的地址為〔 。 A.13 B.33 C.18 D.40 〔9若對n階對稱矩陣A以行序?yàn)橹餍蚍绞綄⑵湎氯切蔚脑?包括主對角線上所有元素>依次存放于一維數(shù)組B[1..>/2]中,則在B中確定aij〔i/2+j B.j*/2+i C.i*/2+j D.j*/2+i 〔10A[N,N]是對稱矩陣,將下面三角〔包括對角線以行序存儲到一

48、維數(shù)組T[N/2]中,則對任一上三角元素a[i][j]對應(yīng)T[k]的下標(biāo)k是〔 。 A.i/2+j B.j/2+iC.i/2+1 D.j/2+1 〔11設(shè)二維數(shù)組A[1.. m,1.. n]〔即m行n列按行存儲在數(shù)組B[1.. m*n]中,則二維數(shù)組元素A[i,j]在一維數(shù)組B中的下標(biāo)為〔 。 A.*n+j B.*n+j-1 C.i* D.j*m+i-1 〔12數(shù)組A[0..4,-1..-3,5..7]中含有元素的個(gè)數(shù)〔 。 A.55 B.45

49、C.36 D.16 〔13廣義表A=,>>,則Head>>>>的值為〔 。 A. B. C.c D.d 〔14廣義表<>的表頭是〔,表尾是〔 。 A.a(chǎn) B.< > C. D. 〔15設(shè)廣義表L=<>,則L的長度和深度分別為〔 。 A.1和1 B.1和3

50、C.1和2 D.2和3 〔1已知模式串t=‘a(chǎn)bcaabbabcab’寫出用KMP法求得的每個(gè)字符對應(yīng)的next和nextval函數(shù)值。 模式串t的next和nextval值如下: j 1 2 3 4 5 6 7 8 9 10 11 12 t串 a b c a a b b a b c a b next[j] 0 1 1 1 2 2 3 1 2 3 4 5 nextval[j] 0 1 1 0 2 1 3 0 1 1 0 5 〔2設(shè)目標(biāo)為t="abcaabbabcabaacb

51、acba",模式為p="abcabaa" ①計(jì)算模式p的naxtval函數(shù)值; ②不寫出算法,只畫出利用KMP算法進(jìn)行模式匹配時(shí)每一趟的匹配過程。 ①p的nextval函數(shù)值為0110132?!瞤的next函數(shù)值為0111232。 ②利用KMP<改進(jìn)的nextval>算法,每趟匹配過程如下: 第一趟匹配: abcaabbabcabaacbacba abcab 第二趟匹配: abcaabbabcabaacbacba abc 第三趟匹配: abcaabbabcabaacbacb

52、a a 第四趟匹配: abcaabbabcabaac bacba <成功> abcabaa 〔3數(shù)組A中,每個(gè)元素A[i,j]的長度均為32個(gè)二進(jìn)位,行下標(biāo)從-1到9,列下標(biāo)從1到11,從首地址S開始連續(xù)存放主存儲器中,主存儲器字長為16位。求: ①存放該數(shù)組所需多少單元? ②存放數(shù)組第4列所有元素至少需多少單元? ③數(shù)組按行存放時(shí),元素A[7,4]的起始地址是多少? ④數(shù)組按列存放時(shí),元素A[4,7]的起始地址是多少? 每個(gè)元素32個(gè)二進(jìn)制位,主存字長16位,故每個(gè)

53、元素占2個(gè)字長,行下標(biāo)可平移至1到11。 〔1242 〔222 〔3s+182 〔4s+142 <4>請將香蕉banana用工具 H< >—Head< >,T< >—Tail< >從L中取出。 L=>,peach>,pear> H〔H〔T〔H〔T〔H〔T〔L 〔5寫一個(gè)算法統(tǒng)計(jì)在輸入字符串中各個(gè)不同字符出現(xiàn)的頻度并將結(jié)果存入文件〔字符串中的合法字符為A-Z這26個(gè)字母和0-9這10個(gè)數(shù)字。 void Count〔 //統(tǒng)計(jì)輸入字符串中數(shù)字字符和字母字符的個(gè)數(shù)。 {int i,num[36]; c

54、har ch; for〔i=0;i<36;i++num[i]=0;// 初始化 while〔〔ch=getchar〔!=‘#’ //‘#’表示輸入字符串結(jié)束。 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ù) printf〔"數(shù)字%d的個(gè)數(shù)=%d\n",i,num[i]; for〔i=10;i<36;i++// 求出字母字符的個(gè)數(shù) printf〔"字母字符%c的個(gè)數(shù)=%

55、d\n",i+55,num[i]; }// 算法結(jié)束。 〔6寫一個(gè)遞歸算法來實(shí)現(xiàn)字符串逆序存儲,要求不另設(shè)串存儲空間。 [題目分析]實(shí)現(xiàn)字符串的逆置并不難,但本題"要求不另設(shè)串存儲空間"來實(shí)現(xiàn)字符串逆序存儲,即第一個(gè)輸入的字符最后存儲,最后輸入的字符先存儲,使用遞歸可容易做到。 void InvertStore //字符串逆序存儲的遞歸算法。 { char ch; static int i = 0;//需要使用靜態(tài)變量 scanf <"%c",&ch>; if //規(guī)定'.'是字符串輸入結(jié)束標(biāo)志 {InvertStore

56、>; A[i++] = ch;//字符串逆序存儲 } A[i] = '\0'; //字符串結(jié)尾標(biāo)記 }//結(jié)束算法InvertStore。 〔7編寫算法,實(shí)現(xiàn)下面函數(shù)的功能。函數(shù)void insert將字符串t插入到字符串s中,插入位置為pos。假設(shè)分配給字符串s的空間足夠讓字符串t插入?!舱f明:不得使用任何庫函數(shù) [題目分析]本題是字符串的插入問題,要求在字符串s的pos位置,插入字符串t。首先應(yīng)查找字符串s的pos位置,將第pos個(gè)字符到字符串s尾的子串向后移動字符串t的長度,然后將字符串t復(fù)制到字符串s的第pos位置后。

57、 對插入位置pos要驗(yàn)證其合法性,小于1或大于串s的長度均為非法,因題目假設(shè)給字符串s的空間足夠大,故對插入不必判溢出。 void insert //將字符串t插入字符串s的第pos個(gè)位置。 {int i=1,x=0; char *p=s,*q=t; //p,q分別為字符串s和t的工作指針 if {printf<"pos參數(shù)位置非法\n">;exit<0>;} while<*p!=’\0’&&i {p++;i++;} //查pos位置 //若pos小于串s長度,則查到pos位置時(shí),i=pos。

58、 if<*p == '/0'> {printf<"%d位置大于字符串s的長度",pos>;exit<0>;} else //查找字符串的尾 while<*p!= '/0'> {p++; i++;} //查到尾時(shí),i為字符‘\0’的下標(biāo),p也指向‘\0’。 while<*q!= '\0'> {q++; x++; } //查找字符串t的長度x,循環(huán)結(jié)束時(shí)q指向'\0'。 for=pos ;j-->{*=*p; p--;}//串s的pos后的子串右移,空出串t的位置。 q--; //指針q回退到串t的最后一個(gè)字符 for

59、+> *p--=*q--; //將t串插入到s的pos位置上 [算法討論] 串s的結(jié)束標(biāo)記<'\0'>也后移了,而串t的結(jié)尾標(biāo)記不應(yīng)插入到s中。 〔8已知字符串S1中存放一段英文,寫出算法format,將其按給定的長度n格式化成兩端對齊的字符串S2, 其多余的字符送S3。 [題目分析]本題要求字符串s1拆分成字符串s2和字符串s3,要求字符串s2"按給定長度n格式化成兩端對齊的字符串",即長度為n且首尾字符不得為空格字符。算法從左到右掃描字符串s1,找到第一個(gè)非空格字符,計(jì)數(shù)到n,第n個(gè)拷入字符串s2的字符不得為空格,然后將余下字符復(fù)制到字符串s3中。 vo

60、id format //將字符串s1拆分成字符串s2和字符串s3,要求字符串s2是長n且兩端對齊 {char *p=s1, *q=s2; int i=0; while<*p!= '\0' && *p== ' '> p++;//濾掉s1左端空格 if<*p== '\0'> {printf<"字符串s1為空串或空格串\n">;exit<0>; } while< *p!='\0' && i{*q=*p; q++; p++; i++;}//字符串s1向字符串s2中復(fù)制 if<*p =='\0'>{ printf<"字符串s1沒有%d個(gè)有效字符\

61、n",n>; exit<0>;} if<*<--q>==' ' > //若最后一個(gè)字符為空格,則需向后找到第一個(gè)非空格字符 {p-- ; //p指針也后退 while<*p==' '&&*p!='\0'> p++;//往后查找一個(gè)非空格字符作串s2的尾字符 if<*p=='\0'> {printf<"s1串沒有%d個(gè)兩端對齊的字符串\n",n>; exit<0>; } *q=*p; //字符串s2最后一個(gè)非空字符 *<++q>='\0'; //置s2字符串結(jié)束標(biāo)記 } *q=s3;p++; //將s1串其余

62、部分送字符串s3。 while <*p!= '\0'> {*q=*p; q++; p++;} *q='\0'; //置串s3結(jié)束標(biāo)記 } <9>設(shè)二維數(shù)組a[1..m, 1..n] 含有m*n 個(gè)整數(shù)。 ①寫一個(gè)算法判斷a中所有元素是否互不相同?輸出相關(guān)信息; ②試分析算法的時(shí)間復(fù)雜度。 [題目分析]判斷二維數(shù)組中元素是否互不相同,只有逐個(gè)比較,找到一對相等的元素,就可結(jié)論為不是互不相同。如何達(dá)到每個(gè)元素同其它元素比較一次且只一次?在當(dāng)前行,每個(gè)元素要同本行后面的元素比較一次〔下面第一個(gè)循環(huán)控制變量p的for循環(huán),然后同第i+1行及以后各行元素比較

63、一次,這就是循環(huán)控制變量k和p的二層for循環(huán)。 int JudgEqual //判斷二維數(shù)組中所有元素是否互不相同,如是,返回1;否則,返回0。 {for for { for //和同行其它元素比較 if {printf<"no">; return<0>; } //只要有一個(gè)相同的,就結(jié)論不是互不相同 for //和第i+1行及以后元素比較 for

64、p++> if {printf<"no">; return<0>; } }// for printf; return<1>; //元素互不相同 }//算法JudgEqual結(jié)束 〔2二維數(shù)組中的每一個(gè)元素同其它元素都比較一次,數(shù)組中共m*n個(gè)元素,第1個(gè)元素同其它m*n-1個(gè)元素比較,第2個(gè)元素同其它m*n-2 個(gè)元素比較,……,第m*n-1個(gè)元素同最后一個(gè)元素比較一次,所以在元素互不相等時(shí)總的比較次數(shù)為 ++…+2+1=〔m*n

65、1>/2。在有相同元素時(shí),可能第一次比較就相同,也可能最后一次比較時(shí)相同,設(shè)在個(gè)位置上均可能相同,這時(shí)的平均比較次數(shù)約為〔m*n/4,總的時(shí)間復(fù)雜度是O。 <10>設(shè)任意n個(gè)整數(shù)存放于數(shù)組A<1:n>中,試編寫算法,將所有正數(shù)排在所有負(fù)數(shù)前面〔要求算法復(fù)雜性為0。 [題目分析]本題屬于排序問題,只是排出正負(fù),不排出大小??稍跀?shù)組首尾設(shè)兩個(gè)指針i和j,i自小至大搜索到負(fù)數(shù)停止,j自大至小搜索到正數(shù)停止。然后i和j所指數(shù)據(jù)交換,繼續(xù)以上過程,直到 i=j為止。 void Arrange //n個(gè)整數(shù)存于數(shù)組A中,本算

66、法將數(shù)組中所有正數(shù)排在所有負(fù)數(shù)的前面 {int i=0,j=n-1,x; //用類C編寫,數(shù)組下標(biāo)從0開始 while {while0> i++; while j--; if {x=A[i]; A[i++]=A[j]; A[j--]=x; }//交換A[i] 與A[j] } }//算法Arrange結(jié)束. [算法討論]對數(shù)組中元素各比較一次,比較次數(shù)為n。最佳情況<已排好,正數(shù)在前,負(fù)數(shù)在后>不發(fā)生交換,最差情況<負(fù)數(shù)均在正數(shù)前面>發(fā)生n/2次交換。用類c編寫,數(shù)組界偶是0..n-1。空間復(fù)雜度為O<1>. .

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!