棧和佇列的基本操作 演算法和應用

2021-10-12 13:33:28 字數 4537 閱讀 6942

一、實驗目的

掌握棧和佇列的基本操作

棧和佇列的演算法設計

棧和佇列的應用

遞迴二、實驗內容迴圈佇列

進製轉換

迷宮-深度策略

迷宮-廣度策略

農夫過河-廣度策略

「聰明的學生」

三、實驗環境

在pta平台進行實驗

四、實驗要求

根據每個實訓的要求完成**提交和測評

五、實驗步驟

描述演算法的原理或實現流程(測評完全正確或部分正確的實訓)

1.迴圈隊列入隊出隊

題目:本題要求實現佇列的順序儲存表示,包括入隊、出隊和取隊頭操作。

審題:本題為迴圈佇列。

實現流程:

(1) 入隊操作:首先檢查佇列是否滿,如果不滿,則在隊尾插入元素,並修改隊尾指標。

①if((squeue->r+1)%squeue->max== squeue->f);

②squeue->elem[squeue->r]=x;

③squeue->r=(squeue->r+1)%(squeue->max);

(2) 出隊操作:首先檢查佇列是否為空,若佇列非空,則刪除隊頭元素,修改隊頭指標。

① if (isnullqueue_seq(squeue))

② squeue->f =( squeue->f+1)%(squeue->max);

(3) 取對頭元素:檢查佇列是否為空,若佇列非空,返回對頭元素。

① if (squeue->r==squeue->f)

② return (squeue->elem[squeue->f]);

2.進製轉換(10->16)

題目:本題要求實現十進位製到十六進製制的轉換,使用者輸入10進製的數,要求輸出該數的16進製表示。

審題:由題意知sstack是順序棧,則可聯絡順序棧的進棧演算法

實現流程:

(1) 入棧操作:首先檢查棧是否滿了,如果滿了,則不能再進行進棧操作,否則能進棧,進棧時需要

先修改棧頂,然後再將元素壓入棧中。

① if(sstack->top>=(sstack->max-1))

② sstack->top++;

③ sstack->elem[sstack->top]=x;

(2) 對於進製轉換函式,要注意:由於再十六進製制中涉及的餘數是10-15,需要用a-f表示,在輸

出結果時也需要a-f,所以在演算法中需要做特殊處理,可以用switch…case語句。

3. 迷宮-深度策略

題目:乙個陷入迷宮的老鼠如何找到出口的問題。老鼠希望系統性地嘗試所有的路徑之後走出迷宮。如果它到達乙個死胡同,將原路返回到上乙個位置,嘗試新的路徑。在每個位置上老鼠可以向八個方向運動,順序是從正東開始按照順時針進行。無論離出口多遠,它總是按照這樣的順序嘗試,當到達乙個死胡同之後,老鼠將進行「回溯」。迷宮只有乙個入口,乙個出口,設計程式要求輸出迷宮的一條通路。迷宮用二維儲存結構表示,1表示障礙,0表示通路;採用回溯法設計求解通路的演算法。要求如下: 1、實現棧的相關操作; 2、利用棧實現回溯演算法輸出路徑。

審題:運用鏈棧知識點。

實現流程:

(1) 建立兩個空棧stackx和stacky。

(2) 將入口entryx和entryy分別壓入棧stackx和stacky中。

(3) while(棧不空)

①取棧頂元素,出棧,當前位置為棧頂元素;

②while(mov<8),即還存在探索的方向。

a. 按照順時針依次探索各個位置(posx,posy)

b. 按照(posx,posy)是出口,輸出路徑,返回1;

c. 如果(posx,posy)是沒有走過的通路

 設定標誌位mark[posx][posy]=1。

 當前位置進棧。

 將(posx,posy)設定為當前位置;

 設定mov=0。

d. 否則(如果(x,y)是沒有走過的通路),mov++。

4.迷宮-廣度策略

題目:乙個陷入迷宮的老鼠如何找到出口的問題。老鼠希望系統性地嘗試所有的路徑之後走出迷宮。如果它到達乙個死胡同,將原路返回到上乙個位置,嘗試新的路徑。在每個位置上老鼠可以向八個方向運動,順序是從正東開始按照順時針進行。無論離出口多遠,它總是按照這樣的順序嘗試,當到達乙個死胡同之後,老鼠將進行「回溯」。迷宮只有乙個入口,乙個出口,設計程式要求輸出迷宮的一條通路。迷宮採用二維儲存結構表示,1表示障礙,0表示通路;要求如下: 1、實現佇列的相關操作; 2、利用佇列進行廣度策略搜尋演算法輸出路徑;

審題:運用鏈佇列知識。

實現流程:

(1) 建立兩個空佇列linkqueuex和linkqueuey。

(2) 將入口entryx和entryy分別壓入棧linkqueuex和linkqueuey中。

(3) while(佇列不空)

①取隊頭元素,出隊。

②for(mov=0;mov<8;mov++),即還存在可以探索的相鄰方向。

a. 按照順時針依次探索各個位置(x,y)

b. 如果(posx,posy)是出口,則輸出路徑,返回。

c. 如果(posx,posy)是沒有走過的通路:

 設定標誌位mark[posx][posy]=1。

 當前位置入隊。

 記錄前驅位置,方便輸出路徑。

5. 農夫過河-廣度策略

題目:乙個農夫帶著乙隻狼、乙隻羊和一棵白菜,身處河的南岸。他要把這些東西全部運到北岸。遺憾的是他只有乙隻小船,小船只能容下他和一件物品。這裡只能是農夫來撐船。同時因為狼吃羊,而羊吃白菜,所以農夫不能留下羊和狼或者羊和白菜單獨在河的一邊,自己離開。好在狼屬於肉食動物,不吃白菜。農夫怎樣才能把所有的東西安全運過河呢? 為了表示每個物品的位置,採用二進位制位來區分南岸和北岸,0表示在南岸,1表示在北岸。用四個二進位制位***x分別表示農夫、狼、菜和羊四個物品所在的位置。例如1110表示農夫、狼和菜在北岸,菜在南岸。農夫過河問題的初始狀態為0000,結束狀態為1111。

審題:使用順序佇列演算法。

實現流程:

(1) 初始狀態0000入隊

(2) 當佇列不空且沒有到達結束狀態1111時迴圈以下操作:

①隊頭狀態出隊。

②按照農夫乙個人走、農夫分別帶上3個走迴圈以下操作:

 如果農夫和他們在同一岸,則計算新的狀態。

 如果新的狀態是安全的並且是沒有處理過的,則更新status[ ],並將新狀態入隊。

③當狀態為1111時逆向輸出staus[ ]陣列。

需要注意的是狀態能否入隊,要判斷以下3條,滿足任何一條都不能入隊。

 不可能:通過判斷是否在同一岸;

 不安全:通過安全函式判斷;

 處理過:記錄處理過的狀態。

6. "聰明的學生"

題目:問題描述:一位邏輯學的教授有三個非常聰明善於推理且精於心算的學生,alice、bob和charles。一天教授給他們出了乙個題。教授在每個人腦門上帖了乙個紙條,每個紙條上寫了乙個正整數,alice、bob和charles分別是3,5,8,並且告訴學生某兩個數的和等於第三個,每個學生只能看見另外兩個同學頭上的正整數,但是看不見自己的。 教授問的順序是alice—bob—charles—alice……經過幾次提問後,當教授再次詢問到charles時,charles露出了得意的笑容,準確的報出了自己頭上的數。

實現流程:每個學生都能知道另外兩個學生的的數字,但不清楚自己的數字,這裡用1,2,3作為例子來分析。a只有兩種情況,一種是(2-1)。另外一種是(2+1),但是a不能確定是哪一種情況,所以a猜不出來。再來看看b,兩種情況分別是(1+3)和(3+1),但是b仍然不能確定。最後是c,兩種情況是(1+2)和(2-1),但是c可以排除(2-1)這個情況的,因為如果c是(2-1),那麼b是在看到a是1,c是1的情況下可以猜出來自己是2,但是b沒有猜出來,故c可以排除的是(2-1)這種情況,因此c只能是(2+1),也就是3。可以分析和總結出最大數字總會被先猜出來,是因為只有最大數字可以排除相減的情況,因為如果他是相減得到的,前面一定有人可以猜出來。現在將問題抽象,即a,b,c,3個學生,他們頭上的數字分別為x1,x2,x3。上述結論可知,最大的數總會先猜出來。不妨假設,b是先猜出來的學生,即x2=x1+x3,而b能排除|x1-x3|這種可能性的依據有兩個,一是x1=x3,那麼b只能是x1+x3,因為三個都是正整數;另外乙個依據是假設x2=|x1-x3|,那麼在前面提問中a或c已經先猜出來了,但他們沒有猜出來,可以確定自己是兩數之和,而非兩數之差。至於a先猜出來還是b先猜出來,如果a>c,那麼a先猜出來,否則c先猜出來。

六、問題記錄和實驗總結(必寫)

1、要熟悉掌握棧和佇列的建立、判空、進棧、出棧、進隊、出隊等一系列基本操作,要分清中棧操作中的順序棧和鏈棧以及佇列中的迴圈佇列和鏈佇列;

2.對於深度遍歷和廣度遍歷,要區別好其使用的對應演算法;

3.對於順序棧中的建立空棧,設定棧頂元素初值要為-1;

4.區別於順序棧,建立空棧時,鏈棧是帶有頭結點的空鏈棧

棧和佇列的基本操作

看歐立奇的 程式設計師面試寶典 的棧和佇列的部分,發現了部分問題。其中棧的部分,不能簡單的用malloc函式來初始化stack,應該呼叫create 函式 而且棧的base應該指向棧的最下面的資料的下乙個位址。全部除錯通過 棧的部分通過單鏈表來實現鏈棧的結構 include using namesp...

棧和佇列的基本操作

一種特殊的的線性表,只允許在固定的一端進行插入和刪除操作。棧被稱作是先進後出的線性表。只允許在一端進行插入資料操作,在另一端刪除資料操作的特殊線性表。具有先進先出的特性。迴圈佇列 簡單了解 隊空 rear front 隊滿 rear 1 maxsize front 初始化 銷毀 增 刪 查 type...

棧和佇列的基本操作

資料結構 棧和佇列的基本操作 棧的基本操作 include include define true 1 define false 0 define ok 1 define error 1 define overflow 2 define stack init size 100 define stac...