版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第三章 棧和隊列(1)(1)郭大慶郭大慶 電子科技大學(xué)生命科學(xué)與技術(shù)學(xué)院電子科技大學(xué)生命科學(xué)與技術(shù)學(xué)院神經(jīng)信神經(jīng)信息教育部重點(diǎn)實(shí)驗(yàn)室息教育部重點(diǎn)實(shí)驗(yàn)室約瑟夫問題15個教徒和個教徒和15 個非教徒在深海上遇險,必須個非教徒在深海上遇險,必須將一半的人投入海中,其余的人才能幸免于將一半的人投入海中,其余的人才能幸免于難,于是想了一個辦法:難,于是想了一個辦法:30個人圍成一圓圈個人圍成一圓圈,從第一個人開始依次報數(shù),每數(shù)到第九個,從第一個人開始依次報數(shù),每數(shù)到第九個人就將他扔入大海,如此循環(huán)進(jìn)行直到僅余人就將他扔入大海,如此循環(huán)進(jìn)行直到僅余15個人為止。問怎樣排法,才能使每次投入個人為止。問怎樣排
2、法,才能使每次投入大海的都是非教徒。大海的都是非教徒。第三章 棧和隊列 本章學(xué)習(xí)兩種特殊的線性數(shù)據(jù)結(jié)構(gòu),它們特殊在定本章學(xué)習(xí)兩種特殊的線性數(shù)據(jù)結(jié)構(gòu),它們特殊在定義的操作不同,即插入和刪除操作只能在線性表的兩端義的操作不同,即插入和刪除操作只能在線性表的兩端進(jìn)行。進(jìn)行。 只能在一端進(jìn)行的只能在一端進(jìn)行的- 棧棧 分別在兩端進(jìn)行的分別在兩端進(jìn)行的- 隊列隊列 線性表線性表 棧棧 隊列隊列Insert(L, i, x) Insert(S, n+1, x) Insert(Q, n, x) 1in+1 Delete(L, i) Delete(S, n) Delete(Q, 1) 1in內(nèi)容提要:3.4
3、隊列的定義及邏輯結(jié)構(gòu)隊列的定義及邏輯結(jié)構(gòu)3.5 循環(huán)隊列存儲結(jié)構(gòu)及操作實(shí)現(xiàn)循環(huán)隊列存儲結(jié)構(gòu)及操作實(shí)現(xiàn)3.6 隊列的鏈?zhǔn)酱鎯Y(jié)構(gòu)及操作實(shí)現(xiàn)隊列的鏈?zhǔn)酱鎯Y(jié)構(gòu)及操作實(shí)現(xiàn)3.1 3.1 棧的定義及邏輯結(jié)構(gòu):定義和邏輯特性n特殊的線性表:操作受限n限定僅在表尾進(jìn)行插入或刪除操作的線性表,允許插入或刪除的一端稱為棧頂(top),另一端稱為棧底(bottom)n老派觀點(diǎn)認(rèn)為棧是“下推表” n新派觀點(diǎn)認(rèn)為棧底不動 - n元素插入棧稱為“入棧”或“壓?!保╬ush)n刪除元素稱為“出?!被颉皬棾觥保╬op)進(jìn)棧進(jìn)棧 出棧出棧an.a1棧頂棧頂棧底棧底一個有關(guān)入棧、出棧的習(xí)題例題:假設(shè)有例題:假設(shè)有A , B
4、, C , D 四個元素;它們?nèi)霔5拇涡驗(yàn)樗膫€元素;它們?nèi)霔5拇涡驗(yàn)锳 B C D,出,出棧次序任意,請問不可能得到下面哪些出棧序列?棧次序任意,請問不可能得到下面哪些出棧序列?( 1 ) A B C D ( 2 ) D B C A ( 3 ) C D B A ( 4 ) C B A D( 5 ) A C B D ( 6 ) D B A C ( 7 ) A D C B ( 8 ) C A B D 答案:答案:( 1 ) A B C D ( 2 ) D B C A ( 3 ) C D B A ( 4 ) C B A D( 5 ) A C B D ( 6 ) D B A C ( 7 ) A D C
5、 B ( 8 ) C A B D 棧的ADTADT描述ADT Stack 數(shù)據(jù)對象:數(shù)據(jù)對象:D = ai | ai屬于屬于Elemset, (i=1,2,n, n0) 數(shù)據(jù)關(guān)系:數(shù)據(jù)關(guān)系:R1 = ai-1,ai|ai-1,ai屬于屬于D,(i=2,3,n) 約定約定an 為棧頂為棧頂, a1為棧底。為棧底。 基本操作基本操作 (9個個): InitStack(&S); DestroyStack(&S); ClearStack(&S); StackEmpty(S); StackLength(S) ; GetTop(S,&e); Push(&S,e);
6、Pop(&S,&e); StackTraverse(S,visit () ADT Stack棧的四個重要基本操作 初始條件:棧初始條件:棧s不存在。不存在。 操作結(jié)果:構(gòu)造了一個空棧。操作結(jié)果:構(gòu)造了一個空棧。 初始條件:棧初始條件:棧s已存在已存在 。 操作結(jié)果:在棧操作結(jié)果:在棧s的頂部插入一個新元素的頂部插入一個新元素e, e成為新的棧頂成為新的棧頂 元素。棧發(fā)生變化。元素。棧發(fā)生變化。 初始條件:棧初始條件:棧s存在且非空。存在且非空。 操作結(jié)果:將棧操作結(jié)果:將棧s的棧頂元素從棧中刪除,并用的棧頂元素從棧中刪除,并用e返回其值。棧發(fā)返回其值。棧發(fā) 生變化。生變化。 初
7、始條件:棧初始條件:棧s存在且非空。存在且非空。 操作結(jié)果:讀棧頂元素并用操作結(jié)果:讀棧頂元素并用e返回其值。棧不變化。返回其值。棧不變化。棧是一種特殊的線性表,因此棧也可采用兩種存儲結(jié)構(gòu):棧是一種特殊的線性表,因此棧也可采用兩種存儲結(jié)構(gòu):順序存儲結(jié)構(gòu)順序存儲結(jié)構(gòu)鏈?zhǔn)酱鎯Y(jié)構(gòu)鏈?zhǔn)酱鎯Y(jié)構(gòu)順序棧p 順序棧的存儲結(jié)構(gòu)順序棧的存儲結(jié)構(gòu)順序棧是指順序棧是指,即利用一組,即利用一組的數(shù)據(jù)元素,同時附設(shè)指針的數(shù)據(jù)元素,同時附設(shè)指針,指示指示在順序棧中的在順序棧中的。棧頂棧頂(top) 棧底棧底(base)棧中元素數(shù)目:棧中元素數(shù)目:n = top - base順序棧p 類型定義(類型定義() 注意注意to
8、p的含義的含義約定約定 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct ElemType *base; ElemType*top; int stacksize; SqStack;順序棧的基本操作:構(gòu)建一個空棧S SStatus InitStack(SqStack *s) s.base=( SElemType *)malloc (STACK_INIT_SIZE * sizeof(SElemType); if(!s.base) return(OVERFLOW); s.top = s.base; s.stack
9、size = STACK_INIT_SIZE; return OK; /* InitStack */順序棧的基本操作:進(jìn)棧操作Status Push(SqStack *s, SElemType e) if (s.top s.base = s.stacksize) l_temp=(SElemType*)realloc (s.base,(s.stacksize+STACKINCREMENT) *sizeof(SElemType); if (!l_temp) return(OVERFLOW); s.base = l_temp; s.top = s.base + s.stacksize; s.stac
10、ksize += STACKINCREMENT; *(s.top+) = e; return OK; / /* Push */順序棧的基本操作:出棧操作 Status Pop(SqStack *s, SElemType *e) if (s.top = s.base) return ERROR; *e = *(-s.top); return OK; /* Pop */順序棧的基本操作:取( (棧頂) )元素 Status GetTop(SqStack *s, SElemType *e) if (s.top = s.base) return ERROR; *e = *(s.top-1); retu
11、rn OK; /* Pop */鏈棧:棧的鏈?zhǔn)酱鎯Y(jié)構(gòu)(概略)n鏈棧鏈棧: :同一般線性表的單鏈?zhǔn)酱鎯Y(jié)構(gòu)基本相同。但是應(yīng)同一般線性表的單鏈?zhǔn)酱鎯Y(jié)構(gòu)基本相同。但是應(yīng)該確定鏈表的哪端對應(yīng)于棧頂,如果鏈表尾作為棧頂,則該確定鏈表的哪端對應(yīng)于棧頂,如果鏈表尾作為棧頂,則入、出棧操作的時間復(fù)雜性為入、出棧操作的時間復(fù)雜性為O( n ) . n無棧滿問題(除非分配不出內(nèi)存), 空間可擴(kuò)充n棧頂-鏈表的表頭n可以不必引入頭結(jié)點(diǎn)n入棧相當(dāng)于在單鏈表的第一個結(jié)點(diǎn)之前進(jìn)行插入操作n出棧相當(dāng)于在單鏈表中刪除第一個結(jié)點(diǎn)/* 鏈棧結(jié)點(diǎn)鏈棧結(jié)點(diǎn)*/typedef struct StackNode SElemType
12、data; struct StackNode *next; StackNode,*LinkStackPtr;鏈棧:棧的鏈?zhǔn)酱鎯Y(jié)構(gòu)/* 構(gòu)造一個空棧構(gòu)造一個空棧S */Status InitStack(LinkStack *S) S-top=NULL; /將棧頂指向空,表示為空棧將棧頂指向空,表示為空棧 S-count=0; return OK;/* 鏈棧頭指針鏈棧頭指針*/typedef struct LinkStackPtr top; int count; LinkStack;鏈棧結(jié)構(gòu)鏈棧結(jié)構(gòu) Status Push(LinkStack *S,SElemType e) LinkStackP
13、tr s=(LinkStackPtr)malloc(sizeof(StackNode); s-data=e; s-next=S-top; S-top=s S-count+; return OK;自己考慮出棧自己考慮出棧的操作怎樣實(shí)現(xiàn)的操作怎樣實(shí)現(xiàn)順序棧和鏈棧的比較,以及為什么要用棧?n順序棧和鏈棧的比較:順序棧和鏈棧的比較:n順序棧和鏈棧的進(jìn)棧push和出棧pop操作;n順序棧需要事先確定一個固定的長度,可能會存在內(nèi)存;n鏈棧要求,這也會,但棧的了; 棧的使用過程中,棧的使用過程中,。n為什么要用棧:為什么要用棧:n棧的引入,。n此外,許多高級語言,比如Java、C#等都有對棧結(jié)構(gòu)的封裝,可以
14、直接使用棧的push和pop方法,非常方便。在n非負(fù)十進(jìn)制數(shù)轉(zhuǎn)換成其它進(jìn)制的數(shù)的一種簡單方法:n轉(zhuǎn)換原理:N=(N div d)*d + N mod d div整除,mod求余q例,十進(jìn)制轉(zhuǎn)換成八進(jìn)制:(66)10=(102)8 結(jié)果為余數(shù)的逆序結(jié)果為余數(shù)的逆序( (出棧順序出棧順序) ):n先求得的余數(shù)在寫出結(jié)果時最后寫出,最后求出的余數(shù)最先寫出,先求得的余數(shù)在寫出結(jié)果時最后寫出,最后求出的余數(shù)最先寫出,符合棧的先入后出性質(zhì),故可用棧來實(shí)現(xiàn)數(shù)制轉(zhuǎn)換。符合棧的先入后出性質(zhì),故可用棧來實(shí)現(xiàn)數(shù)制轉(zhuǎn)換。n同理,一個非負(fù)十進(jìn)制整數(shù)同理,一個非負(fù)十進(jìn)制整數(shù)N N轉(zhuǎn)換為另一個等價的基為轉(zhuǎn)換為另一個等價的基
15、為B B的的B B進(jìn)制數(shù),進(jìn)制數(shù),可以采用可以采用 來解決來解決 20166/8=8 66/8=8 余余 2 28/8=1 8/8=1 余余 0 01/8=0 1/8=0 余余 1 1void conversion() InitStack(&s); /初始化一個空棧初始化一個空棧 scanf(“%d”,&N); while(N) Push(&s, N%8); /將余數(shù)依次壓入棧將余數(shù)依次壓入棧 N = N/8; /做整除得到下一次求余操作的整數(shù)做整除得到下一次求余操作的整數(shù) while(!StackEmpty(s) /判斷是否為空棧判斷是否為空棧 Pop(&s,
16、&e); /若不為空,將棧頂元素出棧若不為空,將棧頂元素出棧 printf(“%d”,e); /* conversion */數(shù)制轉(zhuǎn)換算法:數(shù)制轉(zhuǎn)換算法:n中綴表達(dá)式:中綴表達(dá)式:n運(yùn)算符在中間n需要括號改變優(yōu)先級n 9+(3-1)3+10/2n后綴表達(dá)式(逆波蘭法)后綴表達(dá)式(逆波蘭法)n運(yùn)算符在后面n完全不需要括號n9 3 1- 3 * + 10 2 / + 運(yùn)算規(guī)則:依次順序讀入表達(dá)式的符號序列(假設(shè)以作為輸入序運(yùn)算規(guī)則:依次順序讀入表達(dá)式的符號序列(假設(shè)以作為輸入序列的結(jié)束),并根據(jù)讀入的元素符號逐一分析:列的結(jié)束),并根據(jù)讀入的元素符號逐一分析: 當(dāng)遇到的是一個操作數(shù),則壓入
17、棧頂; 當(dāng)遇到的是一個運(yùn)算符, 就從棧中兩次取出棧頂,按照運(yùn)算符對這兩個操作數(shù)進(jìn)行計算。然后將計算結(jié)果壓入棧頂。 如此繼續(xù),直到結(jié)束如此繼續(xù),直到結(jié)束, 這時棧頂?shù)闹稻褪禽斎氡磉_(dá)式的值這時棧頂?shù)闹稻褪禽斎氡磉_(dá)式的值 后綴表達(dá)式后綴表達(dá)式: 9 3 1- 3 * + 10 2 / +3-1=22*3=69+6=1510/2=515+5=20空??諚R粋€關(guān)鍵問題:如何將一個關(guān)鍵問題:如何將?答案:可以通過答案:可以通過來完成轉(zhuǎn)換。來完成轉(zhuǎn)換。 轉(zhuǎn)換規(guī)則:從左到右遍歷中綴表達(dá)式的每個數(shù)字和符號,并做以下轉(zhuǎn)換規(guī)則:從左到右遍歷中綴表達(dá)式的每個數(shù)字和符號,并做以下操作:操作:1.若是若是,即成為后綴表達(dá)
18、式的一部分;,即成為后綴表達(dá)式的一部分;2.若是若是,則,則。 如此繼續(xù),一直到最終輸出后綴表達(dá)式為止。如此繼續(xù),一直到最終輸出后綴表達(dá)式為止。99 3 19 3 1 -9 3 1 3 *+9 3 1 3 *+109 3 1 3 *+10 29 3空??諚? 3 1 - 3# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # $(x, y)=(0, 0)01234567890 1 2 3 4 5 6 7 8 9 求迷宮中一條從
19、入口到出口的路徑的算法可簡單描述如下求迷宮中一條從入口到出口的路徑的算法可簡單描述如下:設(shè)定當(dāng)前位置的初值為入口位置設(shè)定當(dāng)前位置的初值為入口位置:do 若當(dāng)前位置可通若當(dāng)前位置可通,則則 將當(dāng)前位置插入堆棧頂將當(dāng)前位置插入堆棧頂; 若該位置是出口位置若該位置是出口位置,則結(jié)束則結(jié)束; 否則切換當(dāng)前位置的東鄰塊為新的當(dāng)前位置否則切換當(dāng)前位置的東鄰塊為新的當(dāng)前位置; 否則否則 若堆棧不空且棧頂位置尚有其他方向未經(jīng)探索若堆棧不空且棧頂位置尚有其他方向未經(jīng)探索; 則設(shè)定新的當(dāng)前位置為沿順時針方向轉(zhuǎn)到的棧頂位置的下一相則設(shè)定新的當(dāng)前位置為沿順時針方向轉(zhuǎn)到的棧頂位置的下一相 鄰塊鄰塊; 若棧不空但棧頂位置
20、的四周均不可通若棧不空但棧頂位置的四周均不可通, 則則 刪去棧頂位置刪去棧頂位置; 若棧不空若棧不空,則重新測試新的棧頂位置則重新測試新的棧頂位置, 直至找到一個可通的相鄰或出棧至棧空直至找到一個可通的相鄰或出棧至??? (棧不空棧不空)遞歸:在高級語言中,調(diào)用自己和其他函數(shù)并沒有本質(zhì)的不同。我遞歸:在高級語言中,調(diào)用自己和其他函數(shù)并沒有本質(zhì)的不同。我們把們把。遞歸。遞歸。 求階乘時時當(dāng)當(dāng)時時當(dāng)當(dāng) 1 ,)!1( 0 , 1!nnnnn求解階乘函數(shù)的遞歸算法求解階乘函數(shù)的遞歸算法: 1. long fact ( long n ) 2. if ( n = 0 ) return 1; / 3. e
21、lse return n * fact (n- -1); 4. main( ): fact(4)參參數(shù)數(shù)傳傳遞遞結(jié)結(jié)果果返返回回 fact(4): fact(3): fact(2): fact(1): fact(0): 1直接定值為直接定值為1 1計算計算 4*fact(3)計算計算 3*fact(2)計算計算 2*fact(1)計算計算 1*fact(0)12624以主程序中調(diào)用以主程序中調(diào)用FACT(4)(4)為例:為例:n: 4控制鏈返回地址控制鏈返回地址第第1次調(diào)用次調(diào)用fact時的活動記錄時的活動記錄x: 4主程序主程序main的的活動記錄活動記錄棧生長方向棧生長方向棧生長方向棧生長
22、方向n: 4控制鏈返回地址控制鏈返回地址第第1次調(diào)用次調(diào)用fact時的活動記錄時的活動記錄x: 4主程序主程序main的的活動記錄活動記錄n: 3控制鏈返回地址控制鏈返回地址第第2次調(diào)用次調(diào)用fact時的活動記錄時的活動記錄棧生長方向棧生長方向n: 4控制鏈返回地址控制鏈返回地址第第1次調(diào)用次調(diào)用fact 時的活動記錄時的活動記錄x: 4主程序主程序main 的活動記錄的活動記錄n: 3控制鏈返回地址控制鏈返回地址第第2次調(diào)用次調(diào)用fact 時的活動記錄時的活動記錄n: 2控制鏈返回地址控制鏈返回地址n: 1控制鏈返回地址控制鏈返回地址第第3次調(diào)用次調(diào)用fact 時的活動記錄時的活動記錄第第4次調(diào)用次調(diào)用fact 時的活動記錄時的活動記錄自由空間自由空間1! = 12! = 2*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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版臨時租車合同保險條款4篇
- 承建企業(yè)建筑施工合同(2篇)
- 2025年跨境貨運(yùn)車隊承包經(jīng)營合同范本4篇
- 二零二五年度模具采購合同與模具新材料應(yīng)用研究合同4篇
- ktv公關(guān)聘用合同
- 二零二五年度裝配式建筑木工勞務(wù)分包合同協(xié)議4篇
- 2025年度牧業(yè)人才培養(yǎng)與承包服務(wù)合同3篇
- 二零二五年度商場柜臺租賃及品牌形象維護(hù)合同3篇
- 2025年度奶茶店門店食品安全管理合同4篇
- 2025年度農(nóng)業(yè)新型經(jīng)營主體信貸服務(wù)合同3篇
- 乳腺癌的綜合治療及進(jìn)展
- 【大學(xué)課件】基于BGP協(xié)議的IP黑名單分發(fā)系統(tǒng)
- 2025年八省聯(lián)考高考語文試題真題解讀及答案詳解課件
- 信息安全意識培訓(xùn)課件
- 2024年山東省泰安市初中學(xué)業(yè)水平生物試題含答案
- 美的MBS精益管理體系
- 2024安全員知識考試題(全優(yōu))
- 中國大百科全書(第二版全32冊)08
- 法律訴訟及咨詢服務(wù) 投標(biāo)方案(技術(shù)標(biāo))
- 格式塔心理咨詢理論與實(shí)踐
- 英語六級詞匯(全)
評論
0/150
提交評論