版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
數(shù)據(jù)結(jié)構(gòu)與算法第二次實(shí)驗(yàn)報(bào)告電子105班趙萌2010021526實(shí)驗(yàn)二:棧和隊(duì)列的定義及基本操作一、 實(shí)驗(yàn)?zāi)康模?熟練掌握棧和隊(duì)列的特點(diǎn).掌握棧的定義和基本操作,熟練掌握順序棧的操作及應(yīng)用.掌握對列的定義和基本操作,熟練掌握鏈?zhǔn)疥?duì)列的操作及應(yīng)用,掌握環(huán)形隊(duì)列的入隊(duì)和出隊(duì)等基本操作.加深對棧結(jié)構(gòu)和隊(duì)列結(jié)構(gòu)的理解,逐步培養(yǎng)解決實(shí)際問題的編程能力二、 實(shí)驗(yàn)內(nèi)容:定義順序棧,完成棧的基本操作:空棧、入棧、出棧、取棧頂元素;實(shí)現(xiàn)十進(jìn)制數(shù)與八進(jìn)制數(shù)的轉(zhuǎn)換;定義鏈?zhǔn)疥?duì)列,完成隊(duì)列的基本操作:入隊(duì)和出隊(duì);問題描述:(1) 利用棧的順序存儲結(jié)構(gòu),設(shè)計(jì)一組輸入數(shù)據(jù)(假定為一組整數(shù)),能夠?qū)樞驐_M(jìn)行如下操作:.初始化一個(gè)空棧,分配一段連續(xù)的存儲空間,且設(shè)定好棧頂和棧底;.完成一個(gè)元素的入棧操作,修改棧頂指針;.完成一個(gè)元素的出棧操作,修改棧頂指針;.讀取棧頂指針?biāo)赶虻脑氐闹担?將十進(jìn)制數(shù)N和其它d進(jìn)制數(shù)的轉(zhuǎn)換是計(jì)算機(jī)實(shí)現(xiàn)計(jì)算的基本問題,其解決方案很多,其中最簡單方法基于下列原理:即除d取余法。例如:(1348)io=(2504)sNNdiv8Nmod8134816841682102125202從中我們可以看出,最先產(chǎn)生的余數(shù)4是轉(zhuǎn)換結(jié)果的最低位,這正好符合棧的特性即后進(jìn)先出的特性。所以可以用順序棧來模擬這個(gè)過程。以此來實(shí)現(xiàn)十進(jìn)制數(shù)與八進(jìn)制數(shù)的轉(zhuǎn)換;.編寫主程序,實(shí)現(xiàn)對各不同的算法調(diào)用。(2) 利用隊(duì)列的鏈?zhǔn)酱鎯Y(jié)構(gòu),設(shè)計(jì)一組輸入數(shù)據(jù)(假定為一組整數(shù)),能夠?qū)︽準(zhǔn)疥?duì)列進(jìn)行如下操作:.初始化一個(gè)空隊(duì)列,形成一個(gè)帶表頭結(jié)點(diǎn)的空隊(duì);.完成一個(gè)元素的入隊(duì)操作,修改隊(duì)尾指針;.完成一個(gè)元素的出隊(duì)操作,修改隊(duì)頭指針;.修改主程序,實(shí)現(xiàn)對各不同的算法調(diào)用。其他算法的描述省略,參見實(shí)現(xiàn)要求說明。實(shí)現(xiàn)要求:對順序棧的各項(xiàng)操作一定要編寫成為C(C++)語言函數(shù),組合成模塊化的形式,每個(gè)算法的實(shí)現(xiàn)要從時(shí)間復(fù)雜度和空間復(fù)雜度上進(jìn)行評價(jià)。.“初始化棧算法”操作結(jié)果:構(gòu)造一個(gè)空棧S;.“銷毀棧算法”操作結(jié)果:銷毀棧s,S不再存在;.“置空棧算法”操作結(jié)果:把S置為空棧;.“判是否空棧算法”操作結(jié)果:若棧S為空棧,則返回TRUE,否則返回FALSE;.“求棧的長度算法”操作結(jié)果:返回S的元素個(gè)數(shù),即棧的長度;.“取棧頂元素算法”操作結(jié)果:若棧不空,則用e返回S的棧頂元素,并返回0K;否則返回ERROR;.“入棧算法”操作結(jié)果:插入元素e為新的棧頂元素.“出棧算法”操作結(jié)果:若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK;否則返回ERROR;.“實(shí)現(xiàn)十進(jìn)制數(shù)與八進(jìn)制數(shù)的轉(zhuǎn)換算法”操作結(jié)果:輸入任意一個(gè)非負(fù)的十進(jìn)制數(shù),輸出對應(yīng)的八進(jìn)制數(shù);對鏈?zhǔn)疥?duì)列的各項(xiàng)操作一定要編寫成為C(C++)語言函數(shù),組合成模塊化的形式,每個(gè)算法的實(shí)現(xiàn)要從時(shí)間復(fù)雜度和空間復(fù)雜度上進(jìn)行評價(jià)。.“初始化空隊(duì)算法”操作結(jié)果:構(gòu)造一個(gè)空隊(duì)列Q;.“銷毀隊(duì)列算法”操作結(jié)果:銷毀隊(duì)列Q(無論空否均可);.“空隊(duì)列算法”操作結(jié)果:將Q清為空隊(duì)列;.“判隊(duì)列是否為空算法”操作結(jié)果:若Q為空隊(duì)列,則返回TRUE,否則返回FALSE;.“求隊(duì)列的長度算法”操作結(jié)果:求隊(duì)列的長度,返回隊(duì)列中結(jié)點(diǎn)的個(gè)數(shù);.“取隊(duì)頭元素算法”操作結(jié)果:若隊(duì)列不空,則用e返回Q的隊(duì)頭元素,并返回0K,否則返回ERROR;.“入隊(duì)算法”操作結(jié)果:插入元素e為Q的新的隊(duì)尾元素;.“出隊(duì)算法”操作結(jié)果:若隊(duì)列不空,刪除Q的隊(duì)頭元素,用e返回其值,并返回0K,否則返回ERROR;三、參考程序(一)順序棧文件SqStackDef.il中實(shí)現(xiàn)了棧的順序存儲表示#defineSTACK_INIT_SIZE10/*存儲空間初始分配量*/#defineSTACKINCREMENT2/*存儲空間分配增量*/typedefstmctSqStackSElemType*base;/*在棧構(gòu)造之前和銷毀之后,base的值為NULL*/SElemType*top;/*棧頂指針*/mtstacksize;/*當(dāng)前己分配的存儲空間,以元素為單位*/}SqStack;/*順序棧*/文件SqStackAlgo.h中實(shí)現(xiàn)順序棧的基本操作(存儲結(jié)構(gòu)由SqStackDef.h定義)StatusLutStack(SqStack&S)(/*構(gòu)造一個(gè)空棧S*/S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S.base)exit(OVERFLOW);/*存儲分配失敗*/S.top=S.base;S.stacksize=STACKINITSIZE;retuniOK;)StatusDestroyStack(SqStack&S){/*銷毀棧s,s不再存在*/fiee(S.base);S.base=NULL;S.top=NULL;S.stacksize=O;retuniOK;)StatusCleaiStack(SqStack&S){/*把s置為空棧*/S.top=S.base;retuniOK;)StatusStackEmpty(SqStackS){/*若棧S為空棧,則返回TRUE,否則返回FALSE*/if(S.top==S.base)returnTRUE;elsereturnFALSE;mtStackLength(SqStackS){/*返回s的元素個(gè)數(shù),即棧的長度*/returnS.top-S.base;)StatusGetTop(SqStackS,SEleniType&e){/*若棧不空,則用e返回S的棧頂元素,并返回OK;否則返回ERROR*/if(S.top>S.base){e=*(S.top-l);returnOK;)elsereturnERROR;)StatusPush(SqStack&S,SElemTypee){/*插入元素e為新的棧頂元素*/if(S.top-S.base>=S.stacksize)/*棧滿,追加存儲空間*/{S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SEleniType));if(!S.base)exit(OVERFLOW);/*存儲分配失敗*/S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;)*(S.top)++=e;returnOK;)StatusPop(SqStack&S,SElemType&e){/*若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK;否則返回ERROR*/if(S.top==S.base)returnERROR;e=*-S.top;retuniOK;}StatusStackTraverse(SqStackS,Status(*visit)(SElemType))(/*從棧底到棧頂依次對棧中每個(gè)元素調(diào)用函數(shù)VlSltOo*//*一旦visit。失敗,則操作失敗*/wlule(S.top>S.base)visit(*S.base++);prmtR”");retuniOK;}voidconversion10_8()/*算法3.1*/(/*對于輸入的任意一個(gè)非負(fù)十進(jìn)制整數(shù),打印輸出與其等值的八進(jìn)制數(shù)*/SqStacks;unsignedn;/*非負(fù)整數(shù)*/SElemTypee;ImtStack(s);/*初始化棧*/pnntf("Entei-annumbei(>=0):");scanf("%u",&n);/*輸入非負(fù)十進(jìn)制整數(shù)n*/while(n)/*當(dāng)n不等于0*/{Push(s,n%8);/*入棧n除以8的余數(shù)(8進(jìn)制的低位)*/n=ii/8;}while(!StackEmpty(s))/*當(dāng)棧不空*/{Pop(s,e);/*彈出棧頂元素且賦值給e*/printf(”%d”,e);/*輸出e*/}pnntfC^i");}在SqStackUse.cpp文件中,測試算法3.1的調(diào)用,其中間接調(diào)用了順序棧的其他基本算法。typedefmtSElemType;/*定義棧元素類型為整型*/#include"pubuse.li"/*常量定義與系統(tǒng)函數(shù)原型聲明,與實(shí)驗(yàn)一中的相同*/include“SqStackDef.h”/*采用順序棧的類型定義*/#include"SqStackAlgo.h"/*利用順序棧的基本操作*/voidmam()(conversionl0_8();/*十進(jìn)制數(shù)到八進(jìn)制轉(zhuǎn)換的驗(yàn)證*/}(二)鏈?zhǔn)疥?duì)列文件LiiikQueueDef.h中實(shí)現(xiàn)單鏈隊(duì)列 隊(duì)列的鏈?zhǔn)酱鎯Y(jié)構(gòu)的表示。typedefstnictQNode{QElemTypedata;stnictQNode*next;)QNode,*QueuePti;typedefstnict{QueuePtrfront,real;/*隊(duì)頭、隊(duì)尾指針*/}LnikQueue;文件LnikQueueAlgo.il中實(shí)現(xiàn)的鏈隊(duì)列的基本算法,其存儲結(jié)構(gòu)由LiiikQueueDef.h定義。StatusLutQueue(LuikQueue&Q)(/*構(gòu)造一個(gè)空隊(duì)列Q*/Q.fiont=Q.iear=(QueuePti)malloc(sizeof(QNode));exit(OVERFLOW);Q.fiont->next=NULL;returnOK;)StatusDestroyQueue(LinkQueue&Q)(/*銷毀隊(duì)列Q(無論空否均可)*/wlule(Q.front){Q.ieai=Q.fiont->next;fiee(Q.fiont);Q.front=Q.rear;)returnOK;)StatusClearQueue(LnikQueue&Q){/*將Q清為空隊(duì)列*/QueuePtip,q;Q.ieai-Q.fiont;p=Q.fiont->next;Q.fiont->next=NULL;while(p)(q=p;p=p->next;free(q);)retuniOK;)StatusQueueEmpty(LuikQueueQ){/*若Q為空隊(duì)列,則返回TRUE,否則返回FALSE*/if(Q.fiont==Q.rear)returnTRUE;elsereturnFALSE;)mtQueueLength(LiiikQueueQ)(/*求隊(duì)列的長度*/mt1=0;QueuePtip;p=Q.fiont;wlule(Q.iear!=p){i+十;p=p->next;)retunii;)StatusGetHead_Q(LmkQueueQ.QElemType&e)(/*若隊(duì)列不空,則用e返回Q的隊(duì)頭元素,并返回OK,否則返回ERROR*/QueuePtip;if(Q.fiont==Q.rear)returnERROR;p=Q.fiont->next;e=p?>data;retuniOK;)StatusEnQueue(LnikQueue&Q,QElemTypee)(/*插入元素e為Q的新的隊(duì)尾元素*/QueuePtip=(QueuePtr)malloc(sizeof(QNode));if(!p)/*存儲分配失敗*/exit(OVERFLOW);p->data=e;p->next=NULL;Q.iear->next=p;Q.ieai-p;retuniOK;)StatusDeQueue(LnikQueue&Q,QElemType&e)(/*若隊(duì)列不空,刪除Q的隊(duì)頭元素,用e返回其值,并返回O虬否則返回ERROR*/QueuePtip;if(Q.fiont==Q.rear)returnERROR;p=Q.fiont->next;e=p?>data;Q.fiont->next=p->next;if(Q.ieai-=p)Q.ieai-Q.fiont;free(p);retuniOK;)StatusQueueTiaveise(LmkQueueQ,void(*vi)(QElemType))(/*從隊(duì)頭到隊(duì)尾依次對隊(duì)列Q中每個(gè)元素調(diào)用函數(shù)vi()o-旦vi失敗,則操作失敗*/QueuePtip;p=Q.fiont->next;while(p)(vi(p->data);p=p->next;)prmtR”\n”);retuniOK;)文件LnikQueueUse.cpp中包含檢驗(yàn)LnikQueueAlgo.h中關(guān)于鏈?zhǔn)疥?duì)列基本操作的聲明、測試數(shù)據(jù)和主函數(shù)。#include"pubuse.li"/*與實(shí)驗(yàn)一的意義相同*/typedefmtQElemType;/*假設(shè)鏈?zhǔn)疥?duì)列中的結(jié)點(diǎn)是一組整數(shù)*/#include"LuikQueueDef.h"#include"LiiikQueueAlgo.h"voidvisit(QElemTypei)(pnntf(H%d”,i);}voidmam(){mti;QElemTyped;LnikQueueq;i=hiitQueue(q);】f(Dpnntf(”成功地構(gòu)造了一個(gè)空隊(duì)列!");pnntfC'是否空隊(duì)列?%d(l:空0:否)M,QueueEmpty(q));pnntf("隊(duì)列的長度為%d\n",QueueLength(q));EnQueue(q,-5);EnQueue(q,5);EnQueue(qJO);pnntf(”插入3個(gè)元素(-5,5,10)后,隊(duì)列的長度為%d\iiM,QueueLengtli(q));printfC*是否空隊(duì)列?%d(l:空0:否)M,QueueEmpty(q));pnntf("隊(duì)列的元素依次為:,QueueTiaveise(q,visit);i=GetHead_Q(q,d);if(i==OK)pnntf(”隊(duì)頭元素是:%d",d);DeQueue(q,d);printfC*刪除了隊(duì)頭元素%d\n”,d);i=GetHead_Q(q,d);if(i==OK)pnntf(”新的隊(duì)頭元素是:%d\n”,d);CleaiQueue(q);pnntf("清空隊(duì)列后,q.front=%uq.ieai=%uq.fiont->next=%u\ii",q.fiont,q.ieai-,q.fiont->next);DestioyQueue(q);pnntf("銷毀隊(duì)列后,q.front=%uq.iear=%u\ii",q.fiont,q.reai);)四、思考題利用一個(gè)堆棧,將一個(gè)線性表中的元素按逆序重新存放。例如原來
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中醫(yī)基礎(chǔ)理論習(xí)題及答案
- 【教育】浙江省高校教師高等教育法規(guī)基礎(chǔ)試題及答案
- 第一周幼兒園營養(yǎng)食譜
- 施工單位技術(shù)負(fù)責(zé)人述職報(bào)告
- 高考新課標(biāo)語文模擬試卷系列之65
- 交通運(yùn)輸行業(yè)安全意識培訓(xùn)總結(jié)
- 互聯(lián)網(wǎng)行業(yè)客服工作總結(jié)
- 物流行業(yè)安全工作總結(jié)
- 家政服務(wù)公司保安工作總結(jié)
- 納米科技行業(yè)保安工作總結(jié)
- 2024年中國陶瓷碗盆市場調(diào)查研究報(bào)告
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實(shí)踐指導(dǎo)材料之22:“8運(yùn)行-8.1運(yùn)行策劃和控制”(雷澤佳編制-2025B0)
- 2024-2030年中國硅肥行業(yè)規(guī)模分析及投資前景研究報(bào)告
- 電網(wǎng)行業(yè)工作匯報(bào)模板22
- 2024-2025學(xué)年一年級數(shù)學(xué)上冊期末樂考非紙筆測試題(二 )(蘇教版2024秋)
- 2024秋期國家開放大學(xué)專科《高等數(shù)學(xué)基礎(chǔ)》一平臺在線形考(形考任務(wù)一至四)試題及答案
- HSE應(yīng)急預(yù)案(完整版)
- 《小學(xué)五年級期末家長會(huì)》課件模板(五套)
- 2024-2024年江蘇省普通高中學(xué)業(yè)水平測試物理試卷(含答案)
- 貴州省黔南布依族苗族自治州2023-2024學(xué)年九年級上學(xué)期期末數(shù)學(xué)試題(含答案)
- 如何高效學(xué)習(xí)學(xué)習(xí)通超星課后章節(jié)答案期末考試題庫2023年
評論
0/150
提交評論