棧是一種只能在一端進行插入或刪除操作的線性表
棧的最主要特點是後進先出(lifo)
n個不同的元素進棧,其出棧次序總數為(catalan number)
c 2n
nn+1
\frac^}
n+1c2n
n
typedef elemtype int
typedef
struct
;
共享棧:如果要用到兩個相同型別的棧,可以用乙個陣列來實現這兩個棧,這稱之為共享棧
typedef elemtype int
typedef
struct linknode
linkstnode;
簡單表示式求值問題:使用者輸入乙個包含「+」、「-」、「*」、「/」、正整數和圓括號的合法算術表示式,計算該表示式的運算結果。
分析:將中綴表示式轉化為字尾(逆波蘭)表示式,然後對該字尾表示式求值。
轉化為字尾表示式的過程:
用字元陣列來儲存字尾表示式,用運算子棧來確定運算子的位置。掃瞄中綴表示式,如果遇到數字,則直接放入字元陣列,如果遇到運算子,則將其與運算子棧的符號依次進行優先順序比較,如果優先順序較高則直接進棧,優先順序較低則一直出棧直到為空或者其優先順序較高。掃瞄完畢,將棧中所有符號放入字元陣列。
字尾表示式求值:
掃瞄字元陣列,如果為數字,則轉化為數值之後進棧,如果為運算子,則出棧兩個運算元並進行計算,將結果進棧。
2. 用棧求解迷宮問題:給定乙個m×n的迷宮圖、入口與出口、行走規則。求一條從指定入口到出口的路徑。所求路徑必須是簡單路徑,即路徑不重複。
分析:對於某乙個不在邊界的方塊而言,與其相鄰的方塊的四個,如果相鄰的方塊可以走,則訪問該方塊,若某方塊的周圍沒有可走方塊,則退棧,回到上乙個方塊,訪問下乙個可以走的方塊。直到訪問至目標方塊(參考圖的深度優先搜尋)
佇列只能選取乙個端點(隊尾)進行插入操作,另乙個端點(隊頭)進行刪除操作
佇列的最主要特點是後進先出(fifo)
typedef elemtype int
;typedef
struct
sqqueue;
在上述順序佇列中,採用rear==maxsize-1為隊滿條件,當隊滿條件為空時,隊中可能還有若干空位置,迴圈佇列就可以解決這種"假溢位"的問題。
把陣列的前端和後端連線起來,形成乙個環形的順序表,即把儲存佇列元素的邏輯上看成乙個環,這就稱之為環形佇列或迴圈佇列
這裡要注意的是:環形佇列的初始化條件是隊尾指標和隊首指標均賦值0,且上述環形佇列由於隊滿條件而造成了乙個位置的空缺
採用鍊錶儲存的佇列稱為鏈隊,這裡採用不帶頭節點的單鏈表實現
通常我們將隊頭和隊尾兩個指標合併起來,於是鍊錶的組成由:
資料節點型別:
typedef
struct qnode
datanode;
鏈隊頭節點型別typedef
struct
linkqunode;
出隊
用佇列求解迷宮問題:
複習 資料結構 棧和佇列
鏈佇列 include include define elemtype char define maxsize 100 typedef struct node 定義節點型別 snode typedef struct lqueue void initqueue lqueue qu void enque...
資料結構複習 棧和佇列 1 棧
1.棧和佇列簡介 棧和佇列是非常重要的兩種資料結構,在軟體設計中應用很多。棧和佇列也是線性結構,線性表,棧和佇列這三種資料元素和資料元素間的邏輯完全相同。差別是線性表的操作不受限制,而棧和佇列的操作收到限制,棧的操作只能在表的一端進行,佇列的插入操作在表的一端進行而其它操作在表的另一端進行,所以把棧...
資料結構複習三 棧和佇列
先簡要介紹以下棧與佇列 棧 stack 是一種後進先出 lifo 的線性表,僅在表尾 即棧頂 進行插入或刪除操作,像火車排程的頭進尾出。佇列 queue 與棧相反,是一種先進先出 fifo 的線性表,只允許在一端進行插入,而在另一端進行刪除,允許插入的一端稱為隊尾,允許刪除的一端則稱為隊頭,就像日常...