版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、l對于棧和隊列上的插入、刪除操作是受某種特殊限制的。因此,棧和隊列也稱作操作受操作受限限的表,或者限制存取點(diǎn)限制存取點(diǎn)的表。l本章除了討論棧和隊列的概念、抽象數(shù)據(jù)類型、表示方法和實現(xiàn)算法外,還將給出一些應(yīng)用的例子。l棧棧是一種特殊的線性表,它所有的插入和刪除都限制在表的同一端進(jìn)行。l表中允許進(jìn)行插入、刪除操作的一端叫做棧的頂頂。l表的另一端則叫做棧的底底。l當(dāng)棧中沒有元素時,稱之為空??諚?。棧的插入運(yùn)算通常稱為進(jìn)棧進(jìn)?;蛉霔H霔#琹棧的刪除運(yùn)算通常稱為退棧退?;虺鰲3鰲?。l棧又稱為后進(jìn)先出表后進(jìn)先出表(Last In First Out表,簡稱LIFO表)或下推表下推表,如圖所示 ADT St
2、ack isoperationsStack createEmptyStack ( void ) 創(chuàng)建一個空棧。int isEmptyStack ( Stack st ) 判斷棧st是否為空棧。void push ( Stack st, DataType x ) 往棧st的棧頂插入一個值為x的元素。void pop ( Stack st ) 從棧st的棧頂刪除一個元素。DataType top ( Stack st ) 求棧頂元素的值。end ADT Stack l用順序的方式表示棧時,棧棧的類型可定義如下: struct SeqStack /* 順序棧類型定義 */ int MAXNUM; /
3、* 棧中最大元素個數(shù) */ int t; /* ttop就是棧頂指針,plstack-top-info是棧頂元素, l1.創(chuàng)建空鏈接棧PLinkStack createEmptyStack_link(void) 創(chuàng)建一空鏈接棧,需要申請鏈接棧結(jié)構(gòu)(struct LinkStack)空間,將其中top置為NULL,返回該結(jié)構(gòu)的地址。 程序?qū)崿F(xiàn)l2. 判斷棧是否為空棧 int isEmptyStack_link( PLinkStack plstack ) 判斷plstack所指的棧是否為空棧,當(dāng)plstack所指的棧為空棧時,則返回1,否則返回0。 程序?qū)崿F(xiàn)l3. 進(jìn)棧運(yùn)算 void push_l
4、ink( PLinkStack plstack, DataType x ) 往plstack所指的棧中插入(或稱壓入)一個值為x的元素。首先申請結(jié)點(diǎn)空間,然后通過指針修改,將結(jié)點(diǎn)插在棧頂。 程序?qū)崿F(xiàn)l4. 出棧運(yùn)算 void pop_link( PLinkStack plstack ) 出棧運(yùn)算,表示從plstack所指的棧中刪除(或稱彈出)一個元素。當(dāng)棧不空時,直接修改棧頂指針,刪除結(jié)點(diǎn)。 程序?qū)崿F(xiàn)l5. 取棧頂元素取棧頂元素 DataType top_link( PLinkStack plstack ) 當(dāng)plstack所指的棧不空時,取棧頂元素的值,棧保持不變。 程序?qū)崿F(xiàn)l本節(jié)在引入遞歸
5、概念的基礎(chǔ)上,介紹棧是怎樣用來實現(xiàn)遞歸,以及怎樣把一個遞歸的函數(shù)轉(zhuǎn)換成一個等價的非遞歸的函數(shù)。l通常用來說明遞歸的最簡單的例子是階乘的定義,它可以表示成: 1 若n = 0n! = n * ( n 1 )! 若n 0這種用自身的簡單情況來定義自己的方式,稱為遞歸定義遞歸定義。在n階乘的定義中,當(dāng)n為0時定義為1,它不再用遞歸來定義,稱為遞歸定義的出口,簡稱為遞歸出口。遞歸出口。lint fact( int n )l int res=n;l if ( n 1 )lres=res* fact( n 1 );l return res;l 函數(shù)fact( n )中又調(diào)用了函數(shù)fact,這種函數(shù)自己調(diào)用
6、自己的作法稱為遞歸調(diào)用遞歸調(diào)用。 包含直接還是間接遞歸調(diào)用的函數(shù)都稱為遞歸函數(shù)遞歸函數(shù)。 l遞歸函數(shù)的執(zhí)行過程 假設(shè)(主)程序中包含一個k=fact(3)語句,這個語句的執(zhí)行過程如下頁的圖所示。 在fact(3)的計算過程中,我們實際不需要生成3個相同的fact程序,只要一個程序在不同的階段能夠處理(3份)不同數(shù)據(jù)。根據(jù)后進(jìn)先出的原則,只要保證把最后調(diào)用的程序使用的空間,保存在一個棧的棧頂就可以了。 l設(shè)有一個程序sub要調(diào)用函數(shù)rout(x),sub本身也可能是一個函數(shù),我們稱之為調(diào)用函數(shù)調(diào)用函數(shù),而稱rout為被調(diào)函數(shù)被調(diào)函數(shù)。調(diào)用函數(shù)中使用調(diào)用語句rout(a)來引起rout函數(shù)的執(zhí)行,
7、這里a稱為實參實參。x稱為形參形參。l一般來說,函數(shù)調(diào)用的實現(xiàn)可以分解成下列三步來進(jìn)行: (1) 傳送調(diào)用信息。(2) 分配被調(diào)函數(shù)需要的數(shù)據(jù)區(qū),并接收傳送來的調(diào)用信息。(3) 把控制轉(zhuǎn)移到被調(diào)函數(shù)的入口。l當(dāng)被調(diào)函數(shù)運(yùn)行結(jié)束,需要返回到調(diào)用函數(shù)時,一般的返回處理也可以分解成下列三步:(1) 傳送返回信息。(2) 釋放被調(diào)函數(shù)的數(shù)據(jù)區(qū)。(3) 把控制按返回地址轉(zhuǎn)移到調(diào)用函數(shù)中去。l在非遞歸調(diào)用的情況下,數(shù)據(jù)區(qū)的分配可以在程序運(yùn)行前進(jìn)行,一直到整個程序運(yùn)行結(jié)束才釋放,這種分配稱為靜態(tài)分配靜態(tài)分配。在遞歸調(diào)用的情況下,被調(diào)函數(shù)的局部量不能分配給固定的某些單元,而必須每調(diào)用一次就分配一份,當(dāng)前程序使
8、用的所有的量(包括形參、局部變量和中間工作單元等),都必須是最近一次遞歸調(diào)用時所分配的數(shù)據(jù)區(qū)中的量。即所謂的動態(tài)分配動態(tài)分配。l動態(tài)分配通常的處理方法是:在內(nèi)存中開辟一個存儲區(qū)域稱為運(yùn)行棧運(yùn)行棧(或簡稱棧棧),每次調(diào)用時,將動態(tài)區(qū)指針下推,分配被調(diào)函數(shù)所需的數(shù)據(jù)區(qū);在每次返回時,將內(nèi)存指針上托,釋放本次調(diào)用所分配的數(shù)據(jù)區(qū),恢復(fù)到上次調(diào)用所分配的數(shù)據(jù)區(qū)中;被調(diào)函數(shù)中變量地址全部采用相對于動態(tài)區(qū)指針的位移量來表示(稱為相對地址相對地址)。 根據(jù)上述思想,不難給出算法4.9階乘計算的非遞歸算法。因為只有一處遞歸調(diào)用,返回地址(locate)和返回值(fact)都容易控制,而且局部量(res)與參數(shù)(
9、n)關(guān)系十分清楚,所以棧中只要保存一個參數(shù)n的值就可以了。這種最簡單的遞歸函數(shù)實現(xiàn)過程相當(dāng)于下面的一個非遞歸函數(shù)。 lint nfact( int n ) int res; PSeqStack st; /* 使用順序存儲結(jié)構(gòu)實現(xiàn)的棧 */ st = createEmptyStack_seq( ); while (n0) push_seq(st,n); n = n 1; res = 1; while (! isEmptyStack_seq(st)res = res * top_seq(st); pop_seq(st); free(st); return ( res );l在迷宮中求從入口到出口的
10、所有路徑是一個經(jīng)典的程序設(shè)計問題。 迷宮可用圖4.5(a)所示的方塊來表示,其中每個元素或為通道(以空白方塊表示),或為墻(以帶陰影的方塊表示)。迷宮迷宮問題問題要求的就是:從入口到出口的一個以空白方塊構(gòu)成的(無環(huán))路徑。 l求解迷宮問題的簡單方法是:從入口出發(fā),沿某一方向進(jìn)行探索,若能走通,則繼續(xù)向前走;否則沿原路返回,換一方向再進(jìn)行探索,直到所有可能的通路都探索到為止。這類方法統(tǒng)稱回溯法回溯法用回溯法求迷宮問題解的過程,可以用一個棧來保存探索的序列。其算法框架如下: mazeFrame( void ) 創(chuàng)建一個(保存探索過程的)空棧;把入口位置壓入棧中;while 棧不空時 取棧頂位置并設(shè)
11、置為的當(dāng)前位置; while 當(dāng)前位置存在試探可能 取下一個試探位置; if (下一個位置是出口) 打印棧中保存的探索過程然后返回 if(下一個位置是通道) 把下一個位置進(jìn)棧并且設(shè)置為的當(dāng)前位置; 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) 迷宮可用二維數(shù)組mazemn來表示,數(shù)組中元素為0的表示通道,為1的表示墻。迷宮的入口處為maze11,出口處為mazem-2n-2,它們的元素值必為0。任意時刻在迷宮中的位置可用元素的行下標(biāo)和列下標(biāo)(i,j)來表示。在某一點(diǎn)mazeij時,可能的運(yùn)動方向有四個??梢越⒁粋€數(shù)組direction42 給出相對于位置(i,j)的四個方向上,i與j的增量值。若在位置(i,j),要進(jìn)入
12、E方向的位置(g,h),則可根據(jù)由該增量值表來修改(i,j)的坐標(biāo),g = i + direction00; h = j + direction01; l棧用順序存儲結(jié)構(gòu)實現(xiàn),棧中的元素類型DataType說明如下: l typedef struct int x,y,d; DataType;算法的實現(xiàn)算法的實現(xiàn)求迷宮中一條路徑的算法,可以從入口開始,對每個“當(dāng)前位置”都從E方向(東方向)試起,若不能通過,則順時針試S方向、W方向、N方向。當(dāng)選定一個可通的方向,即找到“下一個位置”后,要把當(dāng)前所在的位置納入到探索路徑中,并將當(dāng)前所在的位置以及所選的方向記錄下來,以便往下走不通時可順原路一步步地退
13、回來,每退一步以后接著試在該點(diǎn)上尚未試過的方向,從“下一個位置”開始繼續(xù)探索,如此重復(fù)直至到達(dá)出口。 程序?qū)崿F(xiàn):void mazePath(int *maze,int *direction,int x1,int y1,int x2,int y2,int M,int N) l為了這里討論的方便,在不影響問題實質(zhì)的情況下,我們對表達(dá)式做如下簡化:l(1) 假定所有運(yùn)算分量都是整數(shù);(2) 所有運(yùn)算符都是整數(shù)的二元操作,且都用一個字符表示。l例如31 (5 - 22) + 70l這類表達(dá)式中所有運(yùn)算符都出現(xiàn)在它的兩個運(yùn)算分量之間,所以稱為中綴表達(dá)式中綴表達(dá)式。l處理系統(tǒng)通常先把表達(dá)式轉(zhuǎn)換成另一種等價
14、形式:31 5 22 - 70 +,這種形式稱為后綴表達(dá)式后綴表達(dá)式。l這種表達(dá)式里不再需要有括號,每個運(yùn)算符都出現(xiàn)在它的兩個運(yùn)算分量后面。l5 5 (27 + 3 (27 + 3 7) + 22 7) + 22轉(zhuǎn)化為后綴表達(dá)式為:5 27 3 7 5 27 3 7 + + 22 + 22 +舉例:舉例:31*(5-22)+70 轉(zhuǎn)換為:31 5 22 - * 70 +31*(5-22)+70 *(5-22)+70 31 (5-22)+70 * 31 5-22)+70 (* 31 -22)+70 (* 31 5 22)+70 -(* 31 5 )+70 -(* 31 5 22 +70 * 31
15、 5 22 - 70 + 31 5 22 - * + 31 5 22 - * 70 31 5 22 - * 70 +l后綴表達(dá)式的主要優(yōu)點(diǎn)是可以寫出非常簡單的求值過程。使用一個存放運(yùn)算分量的棧,求值過程順序掃描后綴表達(dá)式,每次遇到運(yùn)算分量便將它推入棧中;遇到運(yùn)算符時,就從棧中彈出兩個整數(shù)(運(yùn)算分量)進(jìn)行計算,而后再把結(jié)果推入棧中。這樣,到掃描結(jié)束時,留在棧頂?shù)恼麛?shù)就是所求表達(dá)式的值。l31 5 22 - * 70 + l 5 22 - * 70 + 31l 22 - * 70 + 5 31l - * 70 + 22 5 31l * 70 + -17 31?l 70 + -527?l + 70
16、-527l -457?l -457 計算結(jié)束 l4.4.1 基本概念基本概念 l隊列隊列是一種只允許在表的一端進(jìn)行插入操作,而在另一端進(jìn)行刪除操作的線性表。l允許進(jìn)行刪除的這一端叫隊列的頭頭,允許進(jìn)行插入的這一 端叫隊列的尾尾。l當(dāng)隊列中沒有任何元素時,稱為空隊列空隊列。l隊列的插入操作通常稱為進(jìn)隊列進(jìn)隊列或入隊列入隊列,隊列的刪除操作通常稱為退隊列退隊列或出隊列出隊列。l隊列也稱作先進(jìn)先出表先進(jìn)先出表(First In First Out表,簡稱FIFO表)l4.4.2 抽象數(shù)據(jù)類型ADT Queue isoperationsQueue createEmptyQueue (void ) 創(chuàng)建
17、一個空隊列。int isEmptyQueue ( Queue qu ) 判隊列qu是否為空隊列。void enQueue ( Queue qu, DataType x ) 往隊列qu尾部插入一個值為x的元素。void deQueue ( Queue qu ) 從隊列qu頭部刪除一個元素。DataType frontQueue ( Queue qu ) 求隊列qu頭部元素的值。end ADT Queue l隊列與棧類似,實現(xiàn)時通常采用順序的表示和鏈接的表示。l存儲結(jié)構(gòu) 為了算法設(shè)計上的方便,我們約定:隊頭指針指出實際隊頭元素所在的位置,而隊尾指針指出實際隊尾元素所在位置的下一個位置。struct
18、 SeqQueue /* 順序隊列類型定義 */int MAXNUM; /* 隊列中最大元素個數(shù) */int f,r;DataType *q;typedef struct SeqQueue *PSeqQueue;/* 順序隊列類型的指針類型 */l假設(shè)paqu是PSeqQueue類型的變量,lpaqu-f存放即將要被刪除的元素的下標(biāo),lpaqu-r存放即將要被插入的元素的下標(biāo)。lpaqu-qpaqu-f表示當(dāng)前隊列頭部的元素;lpaqu-qpaqu-r表示當(dāng)前隊列尾部的(即將要插入的)元素。l初始時paqu-f = paqu-r = 0。l當(dāng)前隊列中元素的個數(shù)=paqu-r - paqu-fl
19、當(dāng)paqu-r = paqu-f時,元素的個數(shù)為0,即為空隊列。l在順序表示的隊列中,同樣由于數(shù)組是靜態(tài)結(jié)構(gòu),而隊列是動態(tài)結(jié)構(gòu),也存在隊列溢出問題,即當(dāng)隊列滿時,再作進(jìn)隊操作,這種現(xiàn)象稱為上溢上溢;而當(dāng)隊空時,作刪除操作,這種現(xiàn)象稱為下溢下溢。這些現(xiàn)象在運(yùn)算中都要考慮。由于隊列中經(jīng)常要執(zhí)行插入和刪除運(yùn)算,而每運(yùn)行一次插入或刪除,paqu-r或paqu-f就增加1,使得隊列中的元素被刪除后,其空間就永遠(yuǎn)使用不到了。隊列的動態(tài)變化猶如使整個隊列向右移動。當(dāng)paqu-r = MAXNUM時,再作插入運(yùn)算就會產(chǎn)生溢出,而實際上這時隊列的前端可能還有許多空的(可用的)位置,因此,這種現(xiàn)象稱為假溢出假溢出
20、。 解決假溢出通常采用的方法是: 把數(shù)組paqu-qMAXNUM從邏輯上看成一個環(huán),這種隊列也稱為環(huán)形隊列環(huán)形隊列。當(dāng)表中已有MAXNUM 1個結(jié)點(diǎn)時,如果還要插入,paqu-r和paqu-f就會重合,而這與空隊列的情形相混。為區(qū)分空隊列與滿隊列兩種情況的環(huán)形隊列,一般是犧牲隊列中的一個結(jié)點(diǎn),當(dāng)隊列中已有MAXNUM1個結(jié)點(diǎn)時就稱滿,再要插入就發(fā)生溢出. (a) (b) 圖4.11 環(huán)形隊列paqu 隊列基本運(yùn)算的實現(xiàn)l1. 創(chuàng)建一個空隊列。 PSeqQueue createEmptyQueue_seq( int m ) 創(chuàng)建一個空隊。具體實現(xiàn)與算法2.1類似,需要為隊列申請空間,不同之處是需
21、要將對變量f和r均賦值為0。請讀者自己給出。 l2. 判斷是否為空隊列 int isEmptyQueue_seq( PSeqQueue paqu ) 判斷paqu所指的隊列是否為空隊列。當(dāng)paqu-f = paqu-r時,返回1,否則返回0。l3. 進(jìn)隊運(yùn)算 void enQueue_seq( PSeqQueue paqu, DataType x ) 入隊運(yùn)算,當(dāng)隊列不滿時,將元素x插入paqu所指隊列的隊尾。 程序?qū)崿F(xiàn)l4. 出隊列運(yùn)算 void deQueue_seq( PSeqQueue paqu ) 當(dāng)隊列不空時,刪除paqu所指隊列的隊頭元素。 程序?qū)崿F(xiàn)l5. 取隊列頭部元素 Dat
22、aType frontQueue_seq( PSeqQueue paqu ) 當(dāng)paqu所指的隊列不空時,取隊列頭部元素,隊列本身保持不變。 程序?qū)崿F(xiàn)l存儲結(jié)構(gòu) 隊列的鏈接表示就是用一個單鏈表來表示隊列,隊列中的每個元素對應(yīng)鏈表中的一個結(jié)點(diǎn),結(jié)點(diǎn)的結(jié)構(gòu)與單鏈表中結(jié)點(diǎn)的結(jié)構(gòu)一樣。l為了強(qiáng)調(diào)隊頭和隊尾都是隊列的屬性,這里對隊列增加了一層封裝,引入LinkQueue結(jié)構(gòu)的定義。這樣存儲的隊列簡稱鏈接隊列鏈接隊列。 struct Node;typedef struct Node *PNode;struct Node /* 結(jié)點(diǎn)結(jié)構(gòu) */ DataType info; PNode link; ;stru
23、ct LinkQueue /* 鏈接隊列類型定義 */ PNode f; /* 頭指針 */ PNode r; /* 尾指針 */ ;typedef struct LinkQueue *PLinkQueue;/*鏈接隊列類型的指針類型*/l假設(shè)plqu是PLinkQueue類型的變量,lplqu-f為隊列的頭指針,指向隊列中第一個結(jié)點(diǎn),lplqu-r是隊列尾指針,指向隊列中最后一個結(jié)點(diǎn)(注意:這一點(diǎn)與順序隊列不同!),l當(dāng)plqu-f 為 NULL時隊列為空。 隊列的鏈接表示 1. 創(chuàng)建一個空隊列 PLinkQueue createEmptyQueue_link( void ) 申請隊列結(jié)構(gòu)空
24、間,創(chuàng)建一個空隊列。 程序?qū)崿F(xiàn)l2. 判斷隊列是否為空int isEmptyQueue_link( PLinkQueue plqu )判斷plqu所指的隊列是否為空隊,為空隊時,則返回1,否則返回0。 程序?qū)崿F(xiàn)l3. 進(jìn)隊列運(yùn)算void enQueue_link( PLinkQueue plqu, Datatype x ) 入隊運(yùn)算,表示往plqu所指的隊列中插入一個值為x的元素。 程序?qū)崿F(xiàn)l4. 出隊列運(yùn)算void deQueue_link( PLinkQueue plqu ) 出隊運(yùn)算,表示從plqu所指的隊列中刪除隊頭元素。 程序?qū)崿F(xiàn)l5.取隊列頭部結(jié)點(diǎn)的值 Datatype front
25、Queue_link( PLinkQueue plqu ) 當(dāng)plqu所指的隊列非空時,取隊列頭部元素的值,隊列保持不變。 程序?qū)崿F(xiàn)l一個農(nóng)夫帶著一只狼、一只羊和一棵白菜,身處河的南岸。他要把這些東西全部運(yùn)到北岸。l問題是他面前只有一條小船,船小到只能容下他和一件物品,另外只有農(nóng)夫能撐船。l請問農(nóng)夫該采取什么方案才能將所有的東西運(yùn)過河呢?l算法選擇:算法選擇:l求解這個問題的最簡單的方法是一步一步進(jìn)行試探,每一步都搜索所有可能的選擇,對前一步合適的選擇再考慮下一步的各種方案。l用計算機(jī)實現(xiàn)上述求解的搜索過程可以采用兩種不同的策略:一種是廣度優(yōu)先廣度優(yōu)先(breadth_first) 搜索,另一
26、種是深度優(yōu)先深度優(yōu)先(depth_first) 。l廣度優(yōu)先:廣度優(yōu)先:l廣度優(yōu)先的含義就是在搜索過程中總是首先搜索下面一步的所有可能狀態(tài),然后再進(jìn)一步考慮更后面的各種情況。l要實現(xiàn)廣度優(yōu)先搜索,一般都采用隊列作為輔助結(jié)構(gòu)。把下一步所有可能達(dá)到的狀態(tài)都列舉出來,放在這個隊列中,然后順序取出來分別進(jìn)行處理,處理過程中把再下一步的狀態(tài)放在隊列里。l由于隊列的操作遵循先進(jìn)先出的原則,在這個處理過程中,只有在前一步的所有情況都處理完后,才能開始后面一步各情況的處理。l要模擬農(nóng)夫過河問題,首先需要選擇一個對問題中每個角色的位置進(jìn)行描述的方法。l一個很方便的辦法是用四位二進(jìn)制數(shù)順序分別表示農(nóng)夫、狼、白菜和
27、羊農(nóng)夫、狼、白菜和羊的位置。l例如用0表示農(nóng)夫或者某東西在河的南岸,1表示在河的北岸。因此整數(shù)5(其二進(jìn)制表示為0101) 表示農(nóng)夫和白菜在河的南岸,而狼和羊在北岸。l用整數(shù)location表示上述四位二進(jìn)制描述的狀態(tài),l用下面的四個函數(shù)從上述狀態(tài)中得到每個角色所在位置的代碼。l函數(shù)返回值為真表示所考察的人或物在河的北岸,否則在南岸。 lint farmer(int location) return (0 != (location & 0 x08); int wolf(int location) return (0 != (location & 0 x04);lint cabb
28、age(int location) return (0 != (location & 0 x02); int goat(int location) return (0 !=(location & 0 x01);l還應(yīng)該分析問題中所有角色的各種可能位置構(gòu)成的狀態(tài),確定其中哪些是安全的哪些是不安全的。l根據(jù)原題的描述我們知道,單獨(dú)留下白菜和羊,或單獨(dú)留下狼和羊在某一岸的狀態(tài)是不安全的。l由此可以編一個函數(shù),通過位置分布的代碼來判斷狀態(tài)是否安全。 lint safe(int location) / 若狀態(tài)安全則返回true / 羊吃白菜 if (goat(location) = ca
29、bbage(location) & (goat(location) != farmer(location) ) return (0); / 狼吃羊 if (goat(location) = wolf(location) & (goat(location) != farmer(location) return (0); return (1); / 其他狀態(tài)是安全的l問題的描述問題的描述:l完成了上面的準(zhǔn)備工作,現(xiàn)在的問題變成:l從初始狀態(tài)二進(jìn)制從初始狀態(tài)二進(jìn)制0000(全部在河的南岸全部在河的南岸) 出發(fā),出發(fā),尋找一種全部由安全狀態(tài)構(gòu)成的狀態(tài)序列,它尋找一種全部由安全狀態(tài)構(gòu)成的
30、狀態(tài)序列,它以二進(jìn)制以二進(jìn)制1111(全部到達(dá)河的北岸全部到達(dá)河的北岸) 為最終目標(biāo),為最終目標(biāo),并且在序列中的每一個狀態(tài)都可以從前一狀態(tài)并且在序列中的每一個狀態(tài)都可以從前一狀態(tài)通過農(nóng)夫(可以帶一樣?xùn)|西)劃船過河的動作通過農(nóng)夫(可以帶一樣?xùn)|西)劃船過河的動作到達(dá)。到達(dá)。l為避免不必要的瞎費(fèi)功夫,要求在序列中不應(yīng)該出現(xiàn)重復(fù)的狀態(tài).l為了實現(xiàn)廣度優(yōu)先搜索,算法中需要使用了一個整數(shù)隊列moveTo,它的每個元素表示一個可以安全到達(dá)的中間狀態(tài)。l另外還需要一個數(shù)據(jù)結(jié)構(gòu)記錄已被訪問過的各個狀態(tài),以及已被發(fā)現(xiàn)的能夠到達(dá)當(dāng)前這個狀態(tài)的路徑。l由于在這個問題的解決過程中需要列舉的所有狀態(tài)(二進(jìn)制0000 1111)一共16種,所以可以構(gòu)造一個包含16個元素的整數(shù)順序表來滿足以上的要求。l用順序表的第i個元素記錄狀態(tài)i是否已被訪問過,若已被訪問過則在這個順序表元素中記入前驅(qū)狀態(tài)值,算法中把這個順序表叫做route。lroute的每個分量初始化值均為-1,每當(dāng)我們在隊列中加入一個新狀態(tài)時,就把順序表中以該
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆高考英語二輪專題復(fù)習(xí)與測試專題一閱讀理解第一講細(xì)節(jié)理解題-定位信息找答案
- 小學(xué)一年級數(shù)學(xué)兩位數(shù)加減一位數(shù)能力考核例題帶答案
- 管理的環(huán)境與背景-廈門大學(xué)管理學(xué)院課件
- 保險基礎(chǔ)知識課件-風(fēng)險與保險
- 《戰(zhàn)略型人力資源》課件
- 《慢性咳嗽治療》課件
- 《護(hù)理人員績效考核》課件
- 【課件】財務(wù)數(shù)據(jù)審計分析系統(tǒng)簡介
- 《提升顧客滿意度》課件
- 應(yīng)有格物致知精神課件2
- 貨幣形式的發(fā)展
- 行政拘留的復(fù)議申請書
- 2020年國家公務(wù)員錄用考試《行測》真題(地市級)
- 五年級英語教學(xué)反思12篇 人教版五年級英語上冊教學(xué)反思
- GB/T 1041-2008塑料壓縮性能的測定
- 東營市第二中學(xué)學(xué)生選課指導(dǎo)手冊
- 應(yīng)急滅火疏散預(yù)案(范本)
- SCA自動涂膠系統(tǒng)培訓(xùn)講義課件
- 施工現(xiàn)場臨時建筑驗收表
- 皓月集團(tuán)市場營銷策略研究
- 二次砌筑配管(JDG)技術(shù)交底
評論
0/150
提交評論