棧和隊列是非常重要的兩種數據結構,棧和隊列也是線性結構,線性表、棧和隊列這三種數據結構的數據元素和元素的邏輯關系也相同
差別在於:線性表的操作不受限制,棧和隊列操作受限制(遵循一定的原則),因此棧和隊列也稱為受限制的線性表。
棧的定義:操作在表的尾端進行的線性表,棧頂:TOP,棧底:Bottom。棧中沒有數據:空棧Empty Stack
表示方法:S=(a1,a2,a3,a4……..an)a1為棧底的元素,an為棧頂的元素.這N個數據按照先後順序插入到棧內,找出棧內數據則相反
遵循的原則(Last In First Out 即 LIFO) 或者 (First In Last Out 即 FILO)
現實生活中也有很多列子:洗盤子,用盤子
C#2.0 以下版本只提供了非泛型的 Stack 類,該類繼承了 ICollection、 IEnumerable 和 ICloneable 接口。 C#2.0 提供了泛型的
Stack<T>類,該類繼承 了 IEnumerable<T>、ICollection 和 IEnumerable 接口。
棧的存儲和實現
1.順序棧 :用一塊連續存儲的空間來存儲棧中的元素,連續的空間就是數組表示了。
2.鏈棧:在線性鏈表的基礎上進行操作的,也就說存儲結構采用的是鏈表的形式而操作采用的是FILO方式。
生活中的實例
除了洗盤子是不是還有其他的使用方式呢?
1.數值轉換 是將非負數的十進制轉換成其他進制的數,一般的解決方法是輾轉相除法,例如:十進制5142轉
成八進制:
有圖我們可以看出 (5142)10=(12026)8
轉換思想:
1.判斷N不為0 N%8壓入到棧中
2.判斷N不為0 N%8壓入到棧中
最後N為0 停止,從而棧中的數據全部一個一個的POP得到八進制數值。
2.程序設計中常用的問題:括號匹配問題,簡化起見,只有兩種括號匹配即:()和[] 嵌套的順序是任意的
([]()) 匹配 [()[()][]] 匹配 [(]) 不匹配,加入有一堆這樣的匹配的符號怎麼判斷呢?
思想:1.如果棧為空,則PUSH
2.如果括號和棧頂的括號匹配,則將棧頂的括號POP
3.如果括號和棧棧頂的括號不匹配,則將括號PUSH
4.最後結束時候判斷棧是否為空,為空則匹配,不為空則不匹配
3.常用的算術表達式…..可以自己思考一下……
未完待續………