文章知識點來至於大話資料結構裡邊章節知識, 這篇主要介紹棧與佇列在計算機中儲存形式, 以及在某些演算法領域中對棧和佇列的相關應用。章節最後介紹了著名的逆波蘭表示式, 以及通過演算法來實現該表示式的運算過程。 在實現**的同時新增了流程圖。相關**原始碼請檢視文章最後。
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結構。兩棧共享空間的資料結構一般用在兩個棧的空間需求有相反關係時,也就是乙個棧在增長時另乙個棧在縮短的情況,但是前提是兩個棧具有相同的資料型別。迭代和遞迴 迭代使用的是迴圈結構,遞迴使用的是選擇結構。遞迴必須至少有乙個...