版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)</p><p> 《數(shù)據(jù)結(jié)構(gòu)與算法》課程設(shè)計(jì)報(bào)告</p><p> 題目: 棧的類設(shè)計(jì)</p><p> 作者: </p><p> 指導(dǎo)教師: </p><p> 2013年1 月1
2、2日</p><p><b> 摘 要</b></p><p> 主要實(shí)現(xiàn)入棧、出棧、取棧頂三個功能,并調(diào)用這三個個功能的算法(若棧滿追加存儲;否則將數(shù)據(jù)壓入棧。若??談t提示錯誤;否則刪除棧頂元素。若??談t提示錯誤,否則提取棧頂。)完成棧的中序遍歷,后序遍歷,以及中序到后序轉(zhuǎn)換的表達(dá)式,最后完成后序表達(dá)式的計(jì)算。</p><p><
3、b> 目 錄</b></p><p> 摘要……………………………………2</p><p> 概述………………………………………………5</p><p> 二、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)……………………………………8</p><p> 三、算法設(shè)計(jì)……………………………………………15</p><p&g
4、t; 四、源代碼說明…………………………………………</p><p> 五、結(jié)果與分析…………………………………………</p><p><b> 圖 表 目 錄</b></p><p> 圖(1)?!?</p><p> 圖(2)入棧、出棧操作過程……………………
5、…………………………6</p><p> 圖(3)功能實(shí)現(xiàn)…………………………………………………………8</p><p> 圖(4)入棧流程圖………………………………………………………8</p><p> 圖(5)出棧流程圖………………………………………………………9</p><p> 圖(6)鏈棧結(jié)構(gòu)圖………………………………………
6、………………12</p><p> 圖(7)鏈棧的入棧、出?!?3</p><p><b> 概 述</b></p><p> -----描述部分-------</p><p><b> 棧的概念:</b></p><p>
7、棧(stack)是插入和刪除操作限定在表尾進(jìn)行的線性表。進(jìn)行插入或刪除操作的一端稱為棧頂,另一端稱為棧底。</p><p> 棧的邏輯表示為:S =(a1,a2, …,an)</p><p> 表尾元素an稱為棧頂(top)</p><p> 表頭元素a1稱為棧底(bottom) </p><p> 不含元素的空表稱為空棧 </
8、p><p><b> 棧的基本運(yùn)算包括:</b></p><p> 初始化;⑵判???; ⑶入棧; ⑷出棧; ⑸ 獲取棧頂;(6)棧中當(dāng)前元素個數(shù); (7) 清空棧; </p><p> 棧的運(yùn)算特性是:后進(jìn)先出(Last In First Out--LIFO)或先進(jìn)后出(First In Last Out--FILO)如圖(1)所示。<
9、/p><p> 入棧 出棧</p><p><b> ?。▓D1)棧 </b></p><p> 棧初始化:InitStack(&S) 構(gòu)造了一個空棧。</p><p> 清空棧: ClearStack(&s)將s棧置為空棧。</p><p>
10、 入棧 : Push(&S,&e) 在棧s的頂部插入新元素e,e成為新的棧頂元素,相當(dāng)于線形表ListInsert(&L, n+1, e)。</p><p> 出棧: Pop(&S, &e) 在棧s存在且非空的情況下,返回S棧的棧頂元素,并從s棧中刪除該棧頂元素;否則返回空元素NULL,相當(dāng)于線性表的ListDelete(&L, i, &e)。&l
11、t;/p><p> 空棧 1入 棧 2入 棧 2出 棧 1出棧 </p><p> 2 </p><p> 1 1 1 </p><p> top=-1
12、top=1 top=2 top=1 top=-1 </p><p> 圖(2)入棧、出棧操作過程</p><p> 用整形元素top 來指示當(dāng)前元素位置 。我們可以看到?jīng)]有數(shù)據(jù)時的空棧,此時top =-1,它可以作為判斷空的條件。入棧時加1,出棧時減1,從始至終top的值一直是頂元素的下標(biāo),這樣在獲取棧頂?shù)脑?/p>
13、素時直接可以通過取棧頂下標(biāo)的值 從而得到棧頂。但要注意:為top =-1的情況,因?yàn)橐粋€數(shù)組的下標(biāo)是不可能小于0的。</p><p> 遍歷:所謂遍歷,是指沿著某條搜索路線,依次對棧中每個數(shù)據(jù)均做一次且僅做一次訪問。</p><p> 獲取棧頂元素:GetTop(S, &e)在棧s存在且非空情況下,讀棧頂元素,棧不變化。與Pop(&S, &e)的差別在不刪除棧頂
14、元素,相當(dāng)于線性表的GetElem(L, I, &e)。</p><p> 中序轉(zhuǎn)后序:中序是我們常用的表達(dá)式格式。即數(shù)據(jù)--符號--數(shù)據(jù)或者符號—數(shù)據(jù)—符號—數(shù)據(jù)--符號。我們將一個正規(guī)的計(jì)算式壓入棧中,出棧時變成數(shù)據(jù)—數(shù)據(jù)—符號或者數(shù)據(jù)—數(shù)據(jù)--符號--符號—符號的格式。這個過程我們稱為中序轉(zhuǎn)后序。例如:a+b*c-d是一個中序表達(dá)式,轉(zhuǎn)后序之后變成了ab+c*d-。</p><
15、p> 后序表達(dá)式:邏輯關(guān)系是數(shù)據(jù)在前,符號在后的表達(dá)式。例如:abc+-。</p><p> ------簡單算法分析--------</p><p> 入棧:初始條件是棧已存在;操作結(jié)果是推入棧內(nèi)的新元素e為新的棧頂元素。</p><p> 出棧:初始條件是棧已存在;操作結(jié)果是刪除棧頂元素,并返回棧頂元素。</p><p>
16、 遍歷: 初始條件是有若干的數(shù)據(jù)存在。操作結(jié)果是將所有數(shù)據(jù)依次輸出,得到所有數(shù)據(jù)。</p><p> 獲取棧頂元素:初始條件是棧已存在且非空;操作結(jié)果是得到棧頂元素。</p><p> 中序轉(zhuǎn)后序:首先有一個中序表達(dá)式存在,經(jīng)過邏輯關(guān)系的轉(zhuǎn)變變成后序表達(dá)式。表達(dá)式的值沒有發(fā)生變化,只是表現(xiàn)形式發(fā)生變化而已。</p><p> 后序表達(dá)式:將前序、中序表達(dá)式用后
17、序形式表現(xiàn)。 </p><p><b> 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)</b></p><p><b> 設(shè)計(jì)考慮</b></p><p><b> 圖(3)功能實(shí)現(xiàn)</b></p><p><b> 滿</b></p><p><b
18、> 沒滿</b></p><p><b> 圖(4)入棧流程</b></p><p><b> Y</b></p><p><b> N</b></p><p><b> N</b></p><p>&l
19、t;b> Y</b></p><p> 圖(5)出棧流程圖 </p><p> 獲取棧頂?shù)牧鞒毯统鰲5南嗨?。在第一個出來的時候返回其值,次值就是棧頂。</p><p> 邏輯結(jié)果和存儲結(jié)構(gòu)表示</p><p><b> 入棧</b></p><p> 入棧操作執(zhí)行前,
20、需判斷棧是否已滿,不滿時將值為elem的新元素添加到棧頂 ,棧的結(jié)構(gòu)發(fā)生變化。</p><p> Void Push(Stack &S,DataType elem) </p><p><b> {</b></p><p> If(!Stack_Full(s)) 若棧不滿就不允許插入</p><p>
21、;<b> {</b></p><p><b> S.top++;</b></p><p> S.elem[S.top]=elem;</p><p><b> }</b></p><p><b> Else</b></p><
22、p> Printf(“棧已滿!可執(zhí)行此操作!”);</p><p><b> } </b></p><p><b> 出棧</b></p><p> 出棧操作執(zhí)行前,需判斷棧是否為空,不空時將棧頂元素從棧中取出,棧發(fā)生變化。</p><p> DataType Pop(Sta
23、ck &s)</p><p><b> {</b></p><p> if(!Stack_Empty(S)) 若??眨辉试S執(zhí)行出棧操作</p><p><b> {</b></p><p> Return S.elem[S.top--]</p><p>
24、;<b> }</b></p><p><b> Else</b></p><p> Printf(“棧已空,不可執(zhí)行此操作!”);</p><p><b> }</b></p><p><b> 獲取棧頂元素</b></p>&l
25、t;p> 當(dāng)棧不為空時,根據(jù)top的位置可直接返回棧頂?shù)闹?,棧不發(fā)生變化。</p><p> DataType GetTop(Stack S)</p><p><b> {</b></p><p> If(!Stack_Empty(S))</p><p><b> }</b><
26、/p><p><b> Else</b></p><p> Printf(“棧中已經(jīng)沒有元素!”); </p><p><b> 知識補(bǔ)充</b></p><p> 鏈棧:棧的鏈?zhǔn)酱鎯凶隽笚?,是棧的另一種存儲結(jié)構(gòu)。鏈棧解決了容量很難擴(kuò)充,數(shù)組很大但存儲的數(shù)據(jù)太少而造成的空間浪費(fèi)的問題。<
27、;/p><p><b> 棧的存儲結(jié)構(gòu):</b></p><p><b> top</b></p><p> elem </p><p> elem </p><p> elem <
28、;/p><p> 圖(6)鏈棧的存儲結(jié)構(gòu) </p><p> 圖(6)可以看出,要定義一個棧的結(jié)構(gòu)體,需要有棧頂指針,棧的元素。每次入棧都是在棧頂插入一個結(jié)點(diǎn),top是一個指向棧頂?shù)闹羔?,類似于線性鏈表中的頭結(jié)點(diǎn)。棧的初始化就是用頭插法建立一個帶頭結(jié)點(diǎn)的鏈表,入棧,出棧操作如圖(4)所示。</p><p><b> Node1</b><
29、;/p><p> elem top</p><p> node1 node3 node1</p><p> elem top elem top elem top </p><p> node2 node2
30、 node2</p><p> J1 ^ J1 ^ J1 ^</p><p> (a)初始化 (b)J1入棧 (C)J2入棧 (d)J2出棧</p><p> 圖(7)鏈棧的入棧、出棧操作</p><p> 入棧:入棧操作執(zhí)行前,需判斷棧是否已滿,不
31、滿時將值為elem的新元素添加到棧頂 ,棧的結(jié)構(gòu)發(fā)生變化。</p><p> VoidPush(Stack &S,DataType elem)</p><p><b> {</b></p><p> Stack NewNode=(Stack)malloc(sizeof(StackNode));為新結(jié)點(diǎn)分配空間</p>
32、<p> NewNode->elem=elem; 為新結(jié)點(diǎn)賦值</p><p> NewNode->top=S->top; 將新結(jié)點(diǎn)插入鏈頭</p><p> S->top= NewNode; 棧頂指針指向新結(jié)點(diǎn)</p><p><b> }</b></p><
33、p> 出棧:出棧操作執(zhí)行前,需判斷棧是否為空,不空時將棧頂元素從棧中取出,棧發(fā)生變化。</p><p> DataType Pop(Stack &S) </p><p><b> {</b></p><p> if(!Stack_Empty(S))</p><p><b> {<
34、/b></p><p> DataType ch=GetTop(S);</p><p> Stack S1=(S->top)->top;</p><p> Delete(S->top);</p><p> S->top=S1;</p><p> Return ch;</p
35、><p><b> }</b></p><p><b> Else</b></p><p> printf(“棧已空,不可執(zhí)行此操作!”);</p><p><b> }</b></p><p><b> 獲取棧頂元素</b>
36、</p><p> 當(dāng)棧不為空時,根據(jù)top的位置可直接返回棧頂?shù)闹担瑮2话l(fā)生變化。</p><p> DataType GetTop(Stack S)</p><p><b> {</b></p><p> If(!Stack_Empty(S))</p><p><b> {
37、</b></p><p> Return(S->top)->elem;</p><p><b> }</b></p><p><b> Else</b></p><p> Printf(“棧中已經(jīng)沒有元素!”); </p><p><b&
38、gt; }</b></p><p><b> 三、算法設(shè)計(jì)</b></p><p><b> 主要設(shè)計(jì)思想</b></p><p> 首先創(chuàng)建一個空棧,在空間允許的情況下,將元素壓入棧中。在棧不為空的情況下,將元素取出。取出第一個數(shù),并返回第一個數(shù)的值就是棧頂。元素全被取完時,棧就成為空棧。調(diào)用入棧,出
39、棧,獲取棧頂?shù)脑?,將中序表達(dá)式進(jìn)行入棧,出棧的操作,得到后序表達(dá)式。</p><p><b> 入棧的偽碼描述:</b></p><p> 1 if (stack full) </p><p> 1 success = false </p><p><b> 2 else </b>
40、</p><p> 1 allocate (newPtr) </p><p> 2 newPtr->data = data </p><p> 3 newPtr->next = stack.top </p><p> 4 stack.top = newPtr </p><p> 5 st
41、ack.count = stack.count + 1 </p><p> 6 success = true </p><p> 3 end if </p><p> 4 return success </p><p> end pushStack </p><p><b> 出棧的偽碼描述
42、:</b></p><p> 1 if(stack empty)</p><p> 1 seccess=false</p><p><b> 2 else</b></p><p> 1 dltPtr=stack.top</p><p> 2 dataOut=sta
43、ck.top->data</p><p> 3 stack.top= stack.top->next</p><p> 4 stack.count= stack.count -1</p><p> 5 recycle (dltPtr)</p><p> 6 success=ture</p>&
44、lt;p><b> 3end if </b></p><p> 4return success</p><p> end popStack</p><p> 獲取棧頂?shù)膫未a描述:</p><p> 1 if (stack empty) </p><p> 1 succes
45、s = false </p><p><b> 2 else </b></p><p> 1 dataOut = stack.top->data </p><p> 2 success = true </p><p> 3 end if </p><p> 4 ret
46、urn success </p><p> end stackTop </p><p><b> 源代碼及說明</b></p><p> 本節(jié)列出源程序清單。如果太長,可列出最關(guān)鍵的程序片段并加以解釋,完整的源代碼在附錄里或附軟盤(光盤)。</p><p><b> 結(jié)果與討論</b>&l
47、t;/p><p> 本節(jié)給出程序運(yùn)行結(jié)果并進(jìn)行分析、得出相關(guān)的結(jié)論和下一版本的改進(jìn)建議。本次實(shí)驗(yàn),我們小組運(yùn)用了順序棧的方法來實(shí)現(xiàn)棧的設(shè)計(jì),在實(shí)驗(yàn)初我們緊實(shí)現(xiàn)了入棧,出棧,獲取棧頂?shù)炔僮?,操作過程不具備人機(jī)交互的智能性,程序相對簡單。在實(shí)驗(yàn)過程中經(jīng)老師指導(dǎo),我們對程序進(jìn)行了修改,使功能更加豐富,增加了工作界面,具有多層次的選擇提示,基本上能滿足多種數(shù)據(jù)的輸入和輸出。</p><p> 設(shè)計(jì)
48、的內(nèi)容具有以下優(yōu)點(diǎn):</p><p> 1:有可視化的可供選擇的界面。</p><p> 2:操作簡便和簡單。</p><p><b> 3:功能齊全</b></p><p> 4:用戶可自定義數(shù)據(jù)個數(shù)</p><p> 同時設(shè)計(jì)存在如下不足:</p><p>
49、 1:代碼使用c語言而不是更高級的語言。</p><p><b> 2:界面還不夠美觀</b></p><p> 通過此次實(shí)驗(yàn),我們很好的鞏固了數(shù)據(jù)結(jié)構(gòu)與算法的知識。對棧的了解進(jìn)一步加深。同時培養(yǎng)了我們得合作精神和解決問題的能力。對我們來說是一次深刻的社會體驗(yàn)。</p><p><b> 附 錄</b>&l
50、t;/p><p><b> 參 考 文 獻(xiàn)</b></p><p> [1]《數(shù)據(jù)結(jié)構(gòu)與程序設(shè)計(jì)(c++語言描述)》Robert L.Kruse</p><p> Alexander J.Ryba</p><p> [2]《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》譚浩強(qiáng) 北京:清華大學(xué)出版社2009年9月</p>&
51、lt;p> [3]《數(shù)據(jù)結(jié)構(gòu)與算法(c++版)實(shí)驗(yàn)和課程設(shè)計(jì)教程》 唐寧九 游洪躍 朱宏 孫界平 主編</p><p> [4]《數(shù)據(jù)結(jié)構(gòu)教程上機(jī)實(shí)驗(yàn)指導(dǎo)》 李春堡 北京:清華大學(xué)出版社 2005年7月</p><p><b> 致 謝</b></p><p> 在本次課程設(shè)計(jì)的算法設(shè)計(jì)和編碼過程中得到了老師
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- c++課程設(shè)計(jì)---棧類的設(shè)計(jì)與使用
- 《棧隊(duì)列》課程設(shè)計(jì)說明書
- 數(shù)據(jù)庫課程設(shè)計(jì)---棧的應(yīng)用(數(shù)據(jù)加密)
- 利用棧求表達(dá)式課程設(shè)計(jì)報(bào)告
- 迷宮與棧問題等-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(15級)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---利用棧求表達(dá)式的值
- (鹽城工學(xué)院數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì))棧的應(yīng)用表達(dá)式求值
- 04堆棧操作初始化入棧出棧取棧頂元素
- c語言數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--用棧實(shí)現(xiàn)停車場管理
- SIP協(xié)議棧的研究與設(shè)計(jì).pdf
- 基于USB個人醫(yī)療設(shè)備類協(xié)議棧的研究與設(shè)計(jì).pdf
- ZigBee協(xié)議棧的分析與設(shè)計(jì).pdf
- WirelessHART協(xié)議棧的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 藍(lán)牙協(xié)議棧的設(shè)計(jì)與實(shí)現(xiàn).pdf
- SIMPLE協(xié)議棧的研究與設(shè)計(jì).pdf
- 棧的簡單應(yīng)用
- IMS終端媒體棧的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于棧的gpgpu調(diào)度器設(shè)計(jì)研究(1)
- 順序棧的實(shí)現(xiàn)
- 基于棧的GPGPU調(diào)度器設(shè)計(jì)研究.pdf
評論
0/150
提交評論