堆疊和佇列的應用

2021-07-09 14:49:22 字數 2645 閱讀 7783

目的:

1、計算數學表示式的值。 輸入數學表示式,輸出表示式的計算結果。

數學表示式由單個數字和運算子「+」、「-」、「*」、「/」、「(」、「)」構成,例如 2 + 3 * ( 4 + 5 ) – 6 / 4。假定 表示式輸入格式合法。

2、以乙個 m*n 的長方陣表示迷宮,0 和 1 分別表示迷宮中的通路和障礙。 設計乙個程式,對任意設定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論。

迷宮根據乙個迷宮資料檔案建立。迷宮資料檔案由乙個包含 0、1 的矩陣組成。迷宮的通路可以使用通路上各點的座標序列進行展示(使用圖形展示最佳)。

3、設計電路佈線最短路徑。

要計算表示式,可以把問題分為兩個:

把字串轉為數字可以用c標準庫中的atoi()函式(#include),也可以用c++標準庫中的stringstream(#include),而我是直接自己寫了乙個簡單的函式,只能用於處理正整數,而且不會合適的報錯,但在所給要求還是下夠用了。

int getvalue(string str)

return

value;

}

要對表示式進行解析和計算,可以參考我的這篇文章,也可以像我在這裡所用的方法一樣,通過對每個優先順序的符號進行分析,按優先順序進行運算。

具體來說,就是通過棧來儲存左括號位置,當找到乙個對應右括號位置時對棧頂左括號和右括號中的內容進行再次分析,直到獲得沒有包含括號的內容,對它進行先乘除再加減的四則運算。再把運算結果替代左括號和右括號中的內容拼接到字串中,一直到棧為空,再對剩下的字串直接進行四則運算,得出結果。壓縮包中有具體的**,在這裡就不貼了。

尋找迷宮通路也可以棧來求解。通過棧儲存已經走過的路徑,並在四周查詢能繼續走的格仔,找到就入棧,繼續查詢下乙個能走的格仔;找不到就從棧中刪除當前位置並查詢上乙個格仔附近有沒有可以走的格仔。當找到終點時,返回查詢成功,當棧為空時,返回查詢失敗。

bool findpath()

if (option

<= lastoption)

else

position next;//儲存上一步的位置

path->pop(next);

if (next.row == here.row) //行相同考慮列方向上的移位,

//如果here在next左邊就考慮上面,here在next右邊就考慮下面

option = 2 + next.col - here.col;

else

//列相同考慮行方向上的移位,

//如果here在next下面就考慮右邊,否則當前位置走不通

option = 3 + next.row - here.row;

here = next;}}

delete path;

return true;

}

從檔案中讀取迷宮的資料採用ifstream。

電路佈線就是乙個在方格上求解兩點間最短路徑的問題,可以使用佇列,給四周能標的格仔標上到當前格仔的路徑長度加1並加入佇列,如果是牆壁或已經標過了則判斷為不能標。當找到終點後,返回查詢成功並通過計算路徑數比當前格仔小1的格仔找到回到出發點的路徑,如果隊列為空,返回查詢失敗。

bool findpath(position start, position finish, int& pathlen, position*& path)

position offset[4];

offset[0].row = 0

; offset[0].col = 1;//右

offset[1].row = 1

; offset[1].col = 0;//下

offset[2].row = 0

; offset[2].col = -1;//左

offset[3].row = -1

; offset[3].col = 0;//上

int numofnbrs = 4

; //乙個方格周圍的鄰居數量

position here, nbr;

here.row = start.row

; here.col = start.col

; grid[start.row][start.col] = 2

; //給最開始的點標上2,因為1表示牆

queueq;

do }

if ((nbr.row == finish.row) && (nbr.col == finish.col))

break

; if (q.isempty()) //隊列為空,沒有可以標的點了,但還是沒有到終點

return false;

q.delete(here);

} while (true);

pathlen = grid[finish.row][finish.col] - 2

; path = new position[pathlen];

here = finish;

for (int j = pathlen - 1

; j >= 0; j--)

here = nbr;

}return true;

}

源**:stackandqueue.zip

堆疊和佇列

堆疊是限定插入和刪除操作都在表的同一端進行的線性表。允許插入和刪除元素的一端稱為棧頂,另一端稱為棧底。若棧中無元素,則稱為空棧。一定要記住的是 棧有後進先出的特點,lase in first out,lifo。棧的基本操作除了插入和刪除外,還有建立和撤銷棧等操作。creat 建立乙個空棧 destr...

堆疊和佇列

堆疊是一種後進先出 lifo 的資料結構,在下推堆疊中,只允許兩種操作 將物件推入堆疊,並將物件從堆疊中彈出。元素只能在堆疊頂部新增和刪除。push將物件新增到堆疊頂部,pop從頂部刪除物件。乙個很好理解的例子,有一沓書,你可以只拿走 刪除 頂部的書,也可以在頂部新增新書。判斷其中的 是否成對出現 ...

堆 棧和佇列的區別

目錄 資料結構中的堆 棧和佇列 記憶體申請中的堆和棧 乙個c c 程式占用的記憶體如下 申請記憶體後的響應 申請大小的限制 申請效率的比較 堆和棧中的儲存內容 堆 堆是一種經過排序的樹形資料結構,每個結點都有乙個值。通常我們所說的堆的資料結構,是指二叉堆。堆的特點是根結點的值最小 或最大 且根結點的...