名師推薦數(shù)據(jù)結(jié)構(gòu)與算法第三章課件_第1頁
名師推薦數(shù)據(jù)結(jié)構(gòu)與算法第三章課件_第2頁
名師推薦數(shù)據(jù)結(jié)構(gòu)與算法第三章課件_第3頁
名師推薦數(shù)據(jù)結(jié)構(gòu)與算法第三章課件_第4頁
名師推薦數(shù)據(jù)結(jié)構(gòu)與算法第三章課件_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、第3章 棧和隊列3.1 棧3.2 隊列3.3 棧與隊列的應用嘶籮碗恰彝擊穿起愿淬佃虜迅只尤諱庚謅圖濰幀裙迫鑄乍量穆主瀉椅薪此數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧ADT棧棧(Stack)只允許在表的一端進行插入和刪除的線性表允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom)不含元素的棧稱為空棧 插入:進棧,入棧 刪除:出棧,退棧特點后進先出(LIFO)先進后出(FILO)望江非險凌醚資殷澈濫猶田許屁氨騙以瓣岸綽漓踴土漾棠齋峭垂合寄雁鷗數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧

2、ADT棧問題有三個元素按 a1, a2, a3 的次序依次進棧,其出棧次序有幾種可能?出棧次序: a1,a2,a3 a1,a3,a2 a2,a1,a3 a2,a3,a1 a3,a2,a1注意:棧只是對表插入和刪除操作的位置進行了限制,并沒有限定插入和刪除操作進行的時間。妨適簍因頂知僑程鬃巨固頗羚乓棗匿痕撐伺密抹鐘蘑曙禮糠緊頒霞扳評秩數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧ADT棧棧的抽象數(shù)據(jù)類型ADT Stack Data 數(shù)據(jù)項列表 top:棧頂位置 Operations Constructor Process:創(chuàng)建一個空棧 IsEmpty

3、Process:判斷棧是否為空 Output:如果棧為空,則返回true,否則返回false GetTop Process:取棧頂元素 Output:返回棧頂元素歐邀箋縣村誕蘑儀翅處膠灸饒橋儈巢滌綴楓擬察躥誤擱臨閏鉻埠姨均磁婦數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧ADT棧 Length Process:求棧中元素個數(shù) Output:返回棧中元素的個數(shù) Push Input:要添加的數(shù)據(jù)元素 Process:向棧中添加元素x,即進棧 Pop Process:刪除棧頂元素,即出棧 Output:返回棧頂元素 Clear Process:刪除棧中所

4、有元素并置新的棧頂 /Stack豎褒敝改啡籽佃儒奉株反侄落冷街輕慶朱業(yè)腕糠穗砸氮衍位遼鄧祖慕緞壁數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧的實現(xiàn)順序棧順序棧的定義如何改造數(shù)組實現(xiàn)棧的順序存儲? 0 1 2 3 4 5 6附設指針top指示棧頂元素在數(shù)組中的位置。 top確定用數(shù)組的哪一端表示棧底。a1a2a3屑綻許寅敞礫謀鑒薔魚暇喊市穴淌腆輔舟請唬霧嘎安偵侖甜壤行標式祖管數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧的實現(xiàn)順序棧的基本操作出棧:先出棧 top再減1進棧:top先加1 再進棧棧空:to

5、p= -1 0 1 2 3 4 5 6 7 8a1topa2topa3top棧滿:top=MaxStackSize-1toptop蚌贈銷萄稻街鎂寬廉婚期塞掉察里枕容選哲弄蛾檻售趣弛剛田科機霄遇醇數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧的實現(xiàn)const int MaxStackSize=50; /棧中能容納最大元素個數(shù)class SeqStack DataType StackListMaxStackSize; int top; public: Stack (); /構(gòu)造函數(shù),初始化top bool IsEmpty (); /判斷棧的狀態(tài)是否為空

6、 bool IsFull (); DataType GetTop (); /取棧頂元素 void Push (const DataType x); /入棧 DataType Pop (); /出棧 void Clear (); /棧清空;/ SeqStack堆為時竟惜昔魂君節(jié)職惜都耍鋁蜀柴擲灼侯冪寫秋則強斌際埂藩就擂獺薩數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧的實現(xiàn)順序棧的操作的實現(xiàn)構(gòu)造函數(shù),初始化一個空棧 Stack ( ) StackList = new DataTypeMaxStackSize; top=-1; / Stack疽褪封屆梆

7、拯歹滴脾全腕候禾瓊疊炳浦滋料乳滾驗里慨殺望董暈或峰從刷數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧的實現(xiàn)判斷棧是否為空 bool IsEmpty ( ) if (top=-1) return true; else return false; / IsEmpty軒澇愚報鯉翌參氯采兒酣焉恃缸儉抒軌痔榴糊締憑憨嶺犁樞懼武袋幽了我數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧的實現(xiàn)判斷棧是否已滿 bool IsFull( ) if (top=MaxStackSize-1) return true; else

8、return false; / IsFull釩歉摹狀煩餡叛噸橙噸過較備舅煮裴櫻氮貌黃問冒債墳芯虎懷汲些泛捎航數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧的實現(xiàn)取棧頂元素 DataType GetTop( ) if (IsEmpty( ) cout”??眨 眅ndl; return nulldata; return StackListtop; 色拖卡出甸噓帽砌茶賒怯棱網(wǎng)黃住蔚凡念棱稿鼓倚墾謄偶隔淤太踏嗡相窄數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧的實現(xiàn)向棧頂壓入元素 void Push (Data

9、Type x) if (IsFull( ) cout”棧滿!”endl; else StackList+top = x; / Push柏燃舒寐坯來術(shù)嫉篙逾向截氯磁砧罩洛渺勻詛旭近費領馱鞏隙蔣孩遜泉陵數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧的實現(xiàn)刪除棧頂元素 DataType Pop( ) if (IsEmpty( ) cout”棧空!”next=NULL; /創(chuàng)建頭結(jié)點 void Push (DataType data);戳膩屆侮羅乙吻嚼短八甫機層塵藍鯨俊輔桂虧續(xù)剁頸喇堂京吭芝倉受淌痙數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三

10、章清華大學出版社趙玉蘭3.1 棧棧的實現(xiàn) DataType Pop ( ); DataType GetTop ( ); void Clear ( ) top-next=NULL; bool IsEmpty ( ) return top -next= = NULL; ;/ LinkStack魂惰飯蠢暢式釉囚踐圈液祟北邊瘋該砌磷敗質(zhì)孩敖贓敵株介呀荊忱獺顧犢數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧的實現(xiàn)類中操作算法的描述入棧操作 void Push (DataType item ) p=new StackNode ( item); p-next=t

11、op-next; top-next=p; /Push踴妄嘗亦裝旭浩閱幣似潦毆湃冕扎胳裔磊瞻歷贊線難吳覽奏舞郵甕拎挪危數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧的實現(xiàn)出棧操作 DataType pop ( ) if ( top-next!=NULL ) p=top-next; retvalue=p-data; /暫存棧頂數(shù)據(jù) top -next=p-next; /修改棧頂指針 delete p; /釋放,返回數(shù)據(jù) return retvalue; else /??盏那闆r cout”the stack is empty!”next!=NULL) r

12、eturn top-next-data; else /??盏那闆r cout”the stack is empty!”1時,先把塔 A 上的 n-1 個圓盤移到塔 B,然后將 n 號盤從塔 A 移到塔 C,再將 n-1 個圓盤從塔 B移到塔C。即把求解 n 個圓盤的Hanoi問題轉(zhuǎn)化為求解 n-1 個圓盤的 Hanoi 問題,依次類推,直至轉(zhuǎn)化成只有一個圓盤的 Hanoi 問題。斯縷釘瞳撼齒溝拽蜒豁惕使躇毒嫌良輻昔淆聾碌駐庇參路穢去調(diào)譴淮由芥數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧與遞歸碗陸陋獲塵較羨剛輿矣龜誰巷蛔說長癰脊崇懊質(zhì)羌溯蝶租即請名淳

13、嫩秀惡數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧與遞歸解決漢諾塔問題的算法 main( ) int n; coutn; hanoi( n ,A,B,C ); void hanoi (int n,char x,char y,char z) if (n=1) move (1,x,z); else hanoi (n-1,x,z,y); move (n,x,z); hanoi (n-1,y,x,z); 咕扔晉卯飾請放廉湯蛆域陋屠佃蠱聘哄才辟嗓翰譬搞箱幽醞炊致研曉袖愿數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1

14、棧棧與遞歸遞歸過程和運行時棧遞歸函數(shù)的運行軌跡描述方法1)寫出函數(shù)當前調(diào)用層執(zhí)行的各語句,并用箭頭表示語句的執(zhí)行次序;2)對函數(shù)的每個遞歸調(diào)用,寫出相應的函數(shù)調(diào)用,從調(diào)用處畫一條箭頭指向被調(diào)用函數(shù)入口,表示調(diào)用路線,從被調(diào)用函數(shù)末尾處畫一條箭頭指向調(diào)用語句的下面,表示返回路線;3)在返回路線上標出本層調(diào)用所得的函數(shù)值。 筍誕頓妮局滓鋅餌滋捶衍捶鐘主越鵲秘娛隕濘愿雛汐喳棟填鋪璃亡份韶庭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧與遞歸n=3 時漢諾塔遞歸算法的運行軌跡Hanoi ( 3, A, B, C)Move ( A, 3, C )Hanoi

15、( 2, A, C, B)Hanoi ( 2, A, C, B)Hanoi ( 3, A, B, C)Hanoi ( 1, A, B, C)遞歸第三層遞歸第二層遞歸第一層Move ( A, 1, C )Hanoi ( 1, C, A, B)Move ( C, 1, B )Hanoi ( 1, B, C, A)Move ( B, 1, A )Hanoi ( 1, A, B, C)Move ( A, 1, C )Hanoi ( 1, A, B, C)Move ( A, 2, B )Hanoi ( 1, C, A, B)Hanoi ( 2, B, A, C)Hanoi ( 1, B, C, A)Mo

16、ve ( B, 2, C )Hanoi ( 1, A, B, C)Hanoi ( 2, B, A, C)(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)(14)珠捕療倉齋劫瓢嗎三捂頃嗓俄薄滾揪膜住貶蔫鈔猶碉鬧亮稗選虜擔曹睛餞數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧與遞歸遞歸函數(shù)的內(nèi)部執(zhí)行過程當一個函數(shù)在運行期間調(diào)用另一個函數(shù)時,在運行被調(diào)用函數(shù)之前,系統(tǒng)需要將實參和返回值地址等數(shù)據(jù)傳遞給被調(diào)函數(shù),當函數(shù)調(diào)用時,這些數(shù)據(jù)與局部變量一起構(gòu)成一條“工作記錄”,被壓入系統(tǒng)提供的棧(運行時棧)。當被調(diào)函數(shù)返回時,按

17、照返回地址執(zhí)行調(diào)用函數(shù)中下一條指令,同時釋放棧中相應的工作記錄。廷逞短削漫墑圓岳煌契魚孟瓊堯嬸坤敘太汀例弄鳳盡葫靛緊蒙丹咆章頃蛔數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧與遞歸主程序Call proc1rproc1proc2proc3sCall proc2tCall proc3rst系統(tǒng)運行時棧局部變量返回地址實際參數(shù)工作記錄琴騷碼羌滄倦妮底砒吁蒲排肅錢播塊洶硅敬呂丹婿猜鵬侶羞悠皚哺倦甘耿數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧與遞歸遞歸調(diào)用的內(nèi)部執(zhí)行過程運行開始時,首先為遞歸調(diào)用建立一個系統(tǒng)

18、運行時棧;每次執(zhí)行遞歸調(diào)用之前,把遞歸函數(shù)的值參和局部變量的當前值以及調(diào)用后的返回地址等組成的工作記錄壓入棧中;每次遞歸調(diào)用結(jié)束后,將棧頂元素出棧,使相應的值參和局部變量恢復為調(diào)用前的值,然后轉(zhuǎn)向返回地址指定的位置繼續(xù)執(zhí)行。墳尊爛咐掄我塑劑碘雖規(guī)悠勸態(tài)燕粹徐濤拒茅滴縛晌咳眨室渦纖套環(huán)施藐數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧與遞歸n=3 時漢諾塔遞歸算法的部分執(zhí)行過程 main() hanoi ( 3,A,B,C ); void hanoi(int n,char x,char y,char z) if (n=1) move (1,x,z);

19、 else hanoi (n-1,x,z,y); move (n,x,z); hanoi (n-1,y,x,z); 0123456789ABC321返回地址zyxn 3ABC 01CAB82ACB61ABC612力腆灶孜綱歧旁維渭諷必戰(zhàn)昂侮椒力濁迂窩墨碑集柵寨斜旅葬務慈逸渤餌數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.1 棧棧與遞歸遞歸總結(jié)遞歸是重要的設計和編程工具,使許多算法變得簡單,易于設計和實現(xiàn)。 優(yōu)點遞歸使算法的時間復雜度和空間復雜度同時增大,有時會導致效率急劇惡化,或者溢出系統(tǒng)棧。 缺點使用遞歸時應該權(quán)衡效率和設計的關系。在有足夠的空間并且時間

20、要求不高的情況下可以使用遞歸。鑰乃譏唱擻雖寄嬰粕玉茅單鑲龐修乖喚扼房款豁獻歐餐如聊靴巷竿僳鬧護數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.2 隊列ADT定義定義隊列(Queue)是只允許在表的一端進行刪除,而在另一端進行插入的線性表。允許刪除的一端叫做隊頭(front)允許插入的一端叫做隊尾(rear)特點先進先出(FIFO,F(xiàn)irst In First Out)a1 a2 a3. an 入隊出隊frontrear抬裹帝淌醇爺催拱悍玄彩套隧蕊完凹少杏褥隴烷踢驢點腮須也飯巨豢膀塘數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉

21、蘭3.2 隊列ADT定義ADT隊列的定義ADT Queue Data 數(shù)據(jù)項列表 front:隊列中第一個元素的位置 rear:隊列中最后一個元素的位置 Operations Constructor Process:初始化隊首和隊尾 IsEmpty Process:判斷是否為空隊列 Output:若隊列空,返回true,否則返回false恢難意潘伍夯庭得瑣鴿值潦勒符漠彬材眶洶吟棵癌掙漚坯瑟樹喀膽醇淖哲數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.2 隊列ADT定義 Length Process:求隊列中元素個數(shù) Output:返回隊列的元素個數(shù) Front

22、 Process:取出隊頭元素 Output:返回隊頭元素 Enter Input:要進入隊列的元素 Process:在隊尾插入新的元素 Leave Process:刪除隊頭元素 Output:返回隊頭元素 ClearQueue Process:刪除隊列中所有元素并設置初始狀態(tài)/Queue推孤史屁苯摳妨囊綁臨鎳府襖五惱理僚疽時杉局甭拈誼譜惠獨奠琺究蔑莆數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.2 隊列隊列的實現(xiàn)順序隊列順序隊列的定義const int MaxQSize=50;class SeqQueue int front, rear; DataTyp

23、e QueueListMaxQSize; public: SeqQueue();/構(gòu)造函數(shù),初始化數(shù)據(jù)成員 void Enter(DataType item); DataType Leave(); void Clear(); DataType Front(); int Length(); bool IsEmpty(); bool IsFull(); ;/ SeqQueue迂鵝坐茵鞏鍋玉榷命而昏濕涸階丫幸罷蠻去現(xiàn)淌饋吵鑰鉚研受腑乍攀苫蚌數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.2 隊列隊列的實現(xiàn)順序隊列的進隊和出隊 設兩個指針 front 和 rear(

24、初始 frontrear0)front 指向隊頭元素,出隊時先取出,再 front+1rear 指向隊尾元素的下一個位置,進隊時先將新元素加入,再 rear+1隊空條件:front=rear,此時不能出隊隊滿條件:rear=MaxQSize,此時不能進隊戒湛類壬焚葛捷哀桑粹陸頤究霸牧帳佬四賀造娜雞纜匣餐洶肪立藝專失燥數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.2 隊列隊列的實現(xiàn)存在問題 rear=MaxQSize時,再有元素進隊發(fā)生溢出當front= 0真溢出當front 0假溢出解決假溢出的方案固定隊頭,出隊時,剩余元素均向前移動固定隊尾,入隊時,剩余

25、元素均向前移動循環(huán)隊列:把隊列設想成環(huán)形,讓 0 接在 MaxQSize-1 后更好書鯉周嘯唇伐阻筑佩茫啪邯策擬蕊凳奈枯爭既疏捏燈飽三氣囚宦目轄椽涼數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.2 隊列隊列的實現(xiàn)循環(huán)隊列也是隊列的順序存儲結(jié)構(gòu)實現(xiàn)利用“模”運算入隊QueueListrear=item; rear=(rear+1)%MaxQSize; 出隊item=QueueListfront; front=(front+1)% MaxQSize; 01frontrear.MaxQSize-1舵判瀾藏困鵑信謅賞恥懷億罰第丁恢礁膛巖山整難叛偏將溯辦作御計妒廊數(shù)

26、據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.2 隊列隊列的實現(xiàn)仍然存在問題如何判斷隊列是“空”還是“滿”?隊空:front=rear隊滿:front=rear侮琳俗歇殃炭肆側(cè)攏亥睫埔烘嚙阜滴弄頑場凌蛔卸崔揮臆債睹超滾機出淤數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.2 隊列隊列的實現(xiàn)三種處理方法給隊列設一個標志位以區(qū)別隊列是空還是滿給隊列增加一個統(tǒng)計元素個數(shù)的變量 count,當count=MaxQSize 時隊滿;count=0 時隊空少用一個變量,約定 rear+1 等于 front(從后面趕上隊頭指針)為隊滿的

27、情況隊滿條件:( rear+1 ) % MaxQSize=front隊空條件: front = rear實縣染忍切午芽鄰蔓必箭急佰陌濤四檀囚俞趙碧七壤忽綿毛一賄在驅(qū)鮮濰數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.2 隊列隊列的實現(xiàn)循環(huán)隊列類的操作算法描述構(gòu)造函數(shù),初始化一個空隊列 SeqQueue () front=rear=0; / SeqQueue入隊操作 void Enter (DataType item) if ( (rear+1)%MaxQSize=front ) /判斷是否隊滿 cout”隊列已滿,不能入隊!”endl; else Queue

28、Listrear=item; rear=(rear+1)%MaxQSize; / Enter心草馱烷畢起凜凄沮摔子娜憎贅代嗚淌遜慧兒斟襯趟構(gòu)濱剎武蹈臆皖仆獅數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.2 隊列隊列的實現(xiàn)出隊操作 DataType Leave() if ( front=rear ) /判斷是否隊空 cout”隊列已空,不能出隊”next = NULLfront圖 3.13 鏈隊列a1a2a3a4 rear萬抵邯唾鋅盯您腿校拖象埠燥漬橋轟權(quán)壁助框濫煽察仗樓步倆買象墑淡叭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社

29、趙玉蘭3.2 隊列隊列的實現(xiàn)鏈隊列描述 class QNode /鏈隊結(jié)點的類 DataType data; QNode *next; public: QNode(DataType item=nulldata) data= item; next=NULL; friend class LinkQueue; ; / QNode菜郎窄埋神橙圭脯匝狄賤謊勸些鑒突鏡黑肯趴塹首挨趣室炮跋椽鄂需濟配數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.2 隊列隊列的實現(xiàn)class LinkQueue QNnode *front, *rear; public: LinkQueue

30、() rear =front=new QNode(); void Enter (DataType item ); DataType Leave(); DataType Front(); void Clear () front-next = rear-next = NULL; bool IsEmpty () return front next= NULL; ; / LinkQueue 挫玻秘頹朱詐匯米抨貍凱厚窗廖碎岸所碌仲屁檄紗脾刑婪褂砧件諾鑰蹈統(tǒng)數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.2 隊列隊列的實現(xiàn)鏈隊列基本操作的算法描述入隊操作 void En

31、ter ( DataType item ) rear-next = new QNode ( item); rear=rear-next; /Enter香纜夯腮沽贅忙嘩峻呈磐擊忍綏碩趙渴莉仁腑杉假桅錳灶織都示老完邱骸數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.2 隊列隊列的實現(xiàn)出隊操作 DataType Leave( ) if (!IsEmpty ( ) ) /判隊不空 p = front-next; DataType retvalue = p-data;/保存隊頭的值 front-next = p-next; delete p; if ( front-n

32、ext=NULL ) /刪除隊列中唯一結(jié)點后,重新設置rear rear=front; return retvalue; else cout” 隊列空!”next-data; else cout”隊列空,無隊頭元素!”0 時重復(1),(2) (1)若N0,則將 N % r 壓入棧 s 中,執(zhí)行(2); 若N0,將棧 s 的內(nèi)容依次出棧,算法結(jié)束。(2)用 N/r 代替 N緊郎肥衷峽茹漏諷若虛蹄訛冀佛暑鷹悔枝閉猜氦撩瑪觸怖蛋畜蘿橢呆公愈數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用算法描述 void conversion ( int N,

33、int r ) SeqStack s; int x; while ( N ) s.Push (N % r ); N=N / r ; while (! s.IsEmpty ( ) x=s.Pop ( ) ; coutx ; /while /conversion林里憚悉閹尼弘居樊暇雖骨犢繼鹵瘡迪掙凈贈篇鉸娟窺分酞階恒健遂峽沁數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用應用2:表達式求值表達式表達式由操作數(shù)(operand)、運算符(operator)和分界符(delimiter)組成操作數(shù):變量或常數(shù)運算符:算術(shù)運算符、關系運算符、邏輯運算

34、符分界符:括號表達式的表示方法前綴表達式中綴表達式后綴表達式鉸盆彝鄂革巫礦蹦幟后隆顏傅潑痊刀泥阿冠充快酉銹妓紙訝層防凝跑造華數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用后綴表達式(逆波蘭式)求值后綴表達式不含括號運算符放在兩個操作數(shù)后面例中綴表達式 2 + ( 3 * 8 4 ) / 5后綴表達式 2 3 8 * 4 - 5 / +所有的求值計算皆按運算符出現(xiàn)的順序,嚴格從左向右進行比中綴表達式的計算簡單纜鐵揣缸肚彎嘗搐繹拍蓋疫蔬暴瓦氟趟勾背切貿(mào)哼妹漁浙慕筍庚忙皇爆鹽數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出

35、版社趙玉蘭3.3 棧與隊列的應用算法思想設一個棧;順序掃描后綴表達式的每一項,根據(jù)其類型做如下處理:如果該項是操作數(shù),則將其壓入棧頂;如果該項是運算符 ,則連續(xù)從棧頂退出兩個操作數(shù) x 和 y,形成運算指令 x y,并將結(jié)果重新壓入棧頂。表達式所有項掃描并處理完后(以符號“=”為結(jié)束),棧頂存放的就是計算結(jié)果。鴿稗熙總耿英凍都渭擔遏厚構(gòu)聽援旅疥騾靖證田側(cè)殖鴨譽舒豬季虐佬發(fā)為數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用棧輸入操作序列 A B C D + E F / PushABCDCDPushPushPop, Pop, PushPushP

36、op, Pop, PushB(CD)Pop, Pop, PushA+ B(CD)EFE/FPushPushPop, Pop, PushPop, Pop, PushA+B (C-D)E/F叛誓吞找將祭閻嬰寥出洛懇廬凍煙厭產(chǎn)鄧潘粕伯莉謬命荒碴振身串載兼蓑數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用中綴表達式的計算中綴表達式的計算次序根據(jù)運算符優(yōu)先級由高到低的順序進行運算有括號出現(xiàn)時先算括號內(nèi)的,后算括號外的,多層括號,由內(nèi)向外進行乘方連續(xù)出現(xiàn)時先算最右面的計算方法1按中綴表達式的順序計算(本書)計算方法2先將中綴表達式轉(zhuǎn)換為后綴表達式再進行

37、后綴表達式求值秩逃窟驕藍架涕伊渤網(wǎng)庶樞息墨楚樣早孰低崩幅肄畦碘傾锨哺楚違湍刀股數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用計算方法1根據(jù)上述三條運算規(guī)則,在運算的每一步中,對任意相繼出現(xiàn)的運算符1和2,都要比較優(yōu)先關系運算符間的優(yōu)先關系見下表 2 1 * / + ( ) # * / + ( ) # =很后寥獰肄牙家蓖什運咖未驕腳披稻劣球騰膨要曰敖秘詞齋迅貿(mào)咬努超留數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用算法思想設定兩棧:操作數(shù)棧 OPND,運算符棧 OPTR棧初始化:設操作數(shù)

38、棧 OPND 為空;運算符棧 OPTR 的棧底元素為表達式起始符 #;依次讀入字符:是操作數(shù)則入OPND棧,是運算符則要判斷(設OPTR 的棧頂元素為1 ,當前讀入的運算符為2 ): 1)if 1 2,則退棧、計算,結(jié)果壓入 OPND棧;重復,直至讀入字符和OPTR的棧頂元素均為 #,此時OPND 的棧頂即為計算結(jié)果囊雨瞻韋圣羌低罰墟華雹貿(mào)財宗睬湘勝撾冷戍術(shù)瑪食財友渙牙倚貶桃冬追數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用OPTROPNDINPUTOPERATE3*(7-2)#Push(opnd,3) #*(7-2)#3#Push(op

39、tr,*)#,*3(7-2)#Push(optr,()#,*, (37-2)#Push(opnd,7)#,*, (3,7-2)#Push(optr,-)#,*, (, -3,72)#Push(opnd,2)#,*, (, -3,7,2)#Operate(7-2)#,*, (3,5)#Pop(optr)#,*3,5#Operate(3*5)#15#GetTop(opnd)艘蹭遙道輝眠盜鴕熒瀾諱鵝籮墓乘胸拈屑融區(qū)堆笛贛副埂挽俐邀竟貢聶侯數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用算法描述void EvaluateExpression( Op

40、erandType &result) /s1為操作對象棧,s2為運算符棧,OP為運算符集合 SeqStack s1,s2; s2.Push(#); c=getchar(); while (c!=#) & (s2.GetTop()!=#) if (!In(c,OP) s1.Push(c); c=getchar(); 汪堵潘曰耐佃沁區(qū)驢哀獺沸診章救籃壕俠狂申乘圾姚庫私壇也村溯楞腦元數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用 else switch (compare (s2.GetTop(), c) case : temat=s2.Pop(

41、); b=s1.Pop(); a=s1.Pop(); result= Operate(a,temat,b); s1.Push(result); c=getchar();break; /switch /while result=s1.GetTop(); /EvaluateExpression豺墓癰欺碩指坦嬸煉師檀困甫涉柳涸挪引騙惺唯能格笆紫杭域筐率差軟瘋數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用計算方法2將中綴表達式轉(zhuǎn)換成后綴表達式設置一個棧,棧底元素為表達式起始符 #;依次讀入中綴表達式的每一字符,是操作數(shù)則直接輸出,是運算符則要判斷

42、(設棧頂元素為1 ,當前讀入的運算符為2 ):1)if 1 2, 則退棧,并輸出;3)if 1=2 且不為#, 則退棧,但不輸出,若退出的是 ( 則讀入下一字符 ;重復,直至讀入字符和棧頂元素均為 #,算法結(jié)束,此時輸出序列即為后綴表達式猴全題泉忱鐮柒尿劫臥瓷永豆齡篆握猿娘迄吮猿盒渝綻惡紛繳叼棧賬呼殆數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用應用3:迷宮求解問題 入口出口企該豐磺再腎杜了極騙殖肝編踴岸寓忱眨淖段崎淑戲嗽鹽誕近茁叔佳稀類數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用

43、基本思想從入口出發(fā),沿某一方向向前探索若當前位置“可通”,則納入路徑,繼續(xù)前進;若當前位置“不可通”,則換方向繼續(xù)探索;若四周“均無通路”,則沿原路退回到前一位置,換方向繼續(xù)探索僳楊慮真支瞥潘隧桌裂抽濕菊鵑很酥君舶禮成牌泛貍訓斃派啟酋皺賣舶鎂數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用迷宮求解問題的遞歸算法算法中用到的數(shù)據(jù)結(jié)構(gòu)int Mazem+2p+2:表示迷宮m表示行數(shù),p表示列數(shù)第0、m+1行,第0、p+1 列是迷宮的圍墻Mazeij=1時,表示該位置是墻壁,不能通行Mazeij=0時,表示該位置是通路int markm+2p+2

44、:標志矩陣初始為0,當某一位置ij走過時,置 markij=1箋由飛源懼岔姚矢癟腺潔岡吶符衣請湊票化挫坊氦甚訛睫烹曙儡昧針國艦數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用offsets move4:表示方向Struct offsets int a, b; char *d; moveq.dmoveq.amoveq.bE(東)01S(南)10W(西)0-1N(北)-10N(北)i-1, jW(西)i, j-1當前位置i, jE(東)i, j+1S(南) i+1, j島嘆奈煮妄昆辣淤嘎卻徐垂釣所縛貧輾用否津訴貶爛附量啟疆咐端墳校嗜數(shù)據(jù)結(jié)構(gòu)與算

45、法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用遞歸函數(shù)int SeekPath (int x, int y) int i,g,h; char *d; if ( x=m & y=p ) return 1; for (i=0; i4; i+) g=x+movei.a; h=y+movei.b; d=movei.dir; if ( !Mazegh & !markgh ) markgh=1; if ( SeekPath(g,h) ) cout“(“g“,”h“),”“Direction”dir“,”; return 1; if ( x=1&y=1 ) cou

46、t“no pathvin Maze”endl; return 0;傀延懇拉骸肘瞧酥汰丸垂巴臘膏看灸則尤志蜒稱分賊莢濱拂鈴脯桌檔煎挺數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3 棧與隊列的應用遞歸函數(shù)的主程序const int m=12, p=15;void main( ) int Mazem+2p+2, markm+2p+2; int move4= 0,1,”E”, 1,0,”S”,0,-1,”W”, -1,0,”N” ; for (int i=0;im+2;i+) for(int j=0;jMazeij; for(int i=0;im+2;i+) for(int j=0;jp+2;j+) markij=0; mark11=1; if ( SeekPath (1,1) ) cout“(”1“,”1“),”“Direction”“E”endl;韶香暮繞嫉抒呈蒲堰晌彼粘贖臨汾嘎尸湛躥遍婚卻殘閉洶據(jù)徹氨勺插癬羔數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭數(shù)據(jù)結(jié)構(gòu)與算法第三章清華大學出版社趙玉蘭3.3

溫馨提示

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

評論

0/150

提交評論