大話資料結構 棧與佇列

2021-09-08 16:46:49 字數 3145 閱讀 4598

文章知識點來至於大話資料結構裡邊章節知識, 這篇主要介紹棧與佇列在計算機中儲存形式, 以及在某些演算法領域中對棧和佇列的相關應用。章節最後介紹了著名的逆波蘭表示式, 以及通過演算法來實現該表示式的運算過程。 在實現**的同時新增了流程圖。相關**原始碼請檢視文章最後。

1 棧結構定義

2 棧的順序儲存

3 兩棧共享空間

思路:他們是在陣列的兩端,向中間靠攏top1和top2是兩個棧的棧頂指標, 只要兩個指標不碰頭就可以

4 棧的鏈式儲存

5 棧的順序儲存和鏈式儲存區別

如果棧使用過程中元素變化不可**, 有時候小, 有時候非常大, 那麼推薦用棧的鏈式儲存。 如果一直棧的的元素變化在可控範圍內, 推薦使用棧的順序儲存。

6 字尾表示式

表示式:9 3 1 – 3 * + 10 2 / +

規則:從左到右遍歷表示式中的每個數字和符號, 遇到是數字就進棧, 遇到事符號就就將棧頂兩個數字取出進行計算, 運算結果進棧, 一直到最終獲得結果。

5 中綴表示式轉字尾表示式

中綴表示式「9+(3-1)*3+10/2」轉化為字尾表示式「9 3 1 3 – 3 * + 10 2 / +」

規則:從左到右遍歷表示式的每個數字和符號,若是數字就輸出,就成為字尾表示式的一部分;若是符號,則判斷與其棧頂符號的優先順序,是右括號或者優先順序低於棧頂元素則棧頂元素以此出棧並輸出,並將當前符號進棧,一直到最終輸出字尾表示式。

6 佇列

定義:只允許在一段進行插入操作,而在另一端進行刪除操作的線性表。佇列是一種先進先出的線性表,簡稱fifo。允許插入的一段陳為隊尾,允許刪除的一段稱為對頭

迴圈佇列

定義:我們把佇列頭尾相接的順序儲存結構稱為迴圈佇列

7 佇列的鏈式儲存

佇列的鏈式儲存結構其實就是線性表的單鏈表,只不過它只能頭出尾進,我們把它簡稱為佇列。

8 接下來開始對以上知識點實踐運用,我們已計算器為例來說明演算法對於堆疊的使用。目的是計算表示式9+(3-1)*3+10/2的執行結果

首先我們熟悉下字尾表示式9 3 1 3 – 3 * + 10 2 / +, 他是通過中綴表示式9+(3-1)*3+10/2的來的。 關於中綴表示式轉字尾表示式:

中綴表示式「9+(3-1)*3+10/2」轉化為字尾表示式「9 3 1 3 – 3 * + 10 2 / +」

規則:從左到右遍歷表示式的每個數字和符號,若是數字就輸出,就成為字尾表示式的一部分;若是符號,則判斷與其棧頂符號的優先順序,是右括號或者優先順序低於棧頂元素則棧頂元素以此出棧並輸出,並將當前符號進棧,一直到最終輸出字尾表示式。

關於字尾表示式計算:

表示式:9 3 1 – 3 * + 10 2 / +

規則:從左到右遍歷表示式中的每個數字和符號, 遇到是數字就進棧, 遇到事符號就就將棧頂兩個數字取出進行計算, 運算結果進棧, 一直到最終獲得結果。

9 中綴表示式轉字尾表示式流程圖:

字尾表示式計算結果流程圖:

10 中綴表示式轉字尾表示式實現**:

public

static

string getsufficexpression(string

expression)

if(isnumber(input))

", input);

continue

; }

else

if (input == ")"

)

sufficexpression += string.format(" "

, popvalue);}}

else

if(isoperationchar(input))

var popvalue =operatestack.pop();

if (!isoperationchar(popvalue))

if (comparepriority(input, popvalue) <= 0

)

", popvalue);

}else}}

else

}while (true

)

sufficexpression += string.format(" "

, operatestack.pop());

}return

sufficexpression;

}

中綴表示式轉字尾表示式

字尾表示式計算結果**:

public

static

string getcalculateresult(string

sufficexpression)

if (!isoperationchar(inputchar) && !isnumber(inputchar))

if(isnumber(inputchar))

else

operatestack.push(caculator(inputchar, stacktopleft, stacktopright).tostring(cultureinfo.invariantculture));}}

return

operatestack.pop();

}

字尾表示式計算結果

單元測試:

private

static

void

testcaculator()

單元測試

大話資料結構 (三)棧與佇列

棧的定義 棧是限定僅在表尾進行插入和刪除操作的線性表,是線性表內的乙個小分支。我們把允許插入和刪除的一端稱為棧頂 top 另一端稱為棧底 buttom 不含任何資料元素的棧稱為空棧。棧又稱為後進先出的線性表,簡稱lifo結構。在日常生活中,棧的魅力無處不在,比如ctrl z回退快捷鍵,它會馬上返回到...

大話資料結構4之棧與佇列

1.棧是限定僅在表尾進行插入和刪除操作的線性表。佇列是只允許在一端進行插入操作 而在另一端進行刪除操作的線性表。2.我們把允許插入和刪除的一端稱為棧頂 top 另一端稱為棧底 bottom 不含任何資料元素的棧稱為空棧。棧又稱為後進先出的線性表,簡稱lifo結構。棧的插入操作,叫做進棧,也稱壓棧 入...

大話資料結構(四) 棧和佇列

棧 一種線性表,限定只能在表尾進行插入和刪除的操作。這裡的表尾指的是棧頂,lifo結構。兩棧共享空間的資料結構一般用在兩個棧的空間需求有相反關係時,也就是乙個棧在增長時另乙個棧在縮短的情況,但是前提是兩個棧具有相同的資料型別。迭代和遞迴 迭代使用的是迴圈結構,遞迴使用的是選擇結構。遞迴必須至少有乙個...