棧和隊列是非常重要的兩種資料結構,棧和隊列也是線性結構,線性表、棧和隊列這三種資料結構的資料元素和元素的邏輯關系也相同
差别在于:線性表的操作不受限制,棧和隊列操作受限制(遵循一定的原則),是以棧和隊列也稱為受限制的線性表。
棧的定義:操作在表的尾端進行的線性表,棧頂: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.常用的算術表達式…..可以自己思考一下……
未完待續………
轉載于:https://www.cnblogs.com/slf007/p/4597143.html