在"了解集合本質必須要知曉的概念-鏈表"中,我們了解了鏈表的概念和種類,並且模擬了一個單向鏈表。本篇體驗的堆棧是約束版的鏈表,只能在棧頂接收新節點和釋放節點。
堆棧的主要操作是壓棧和出棧。壓棧是將新節點放在棧頂,出棧是從棧頂取出一個節點,返回新彈出節點的數據項。堆棧也稱為後進先出的數據結構。
接著上一篇,寫一個派生於List的類來模擬堆棧的壓棧和出棧。
namespace LinkedListLibrary{public class StackInheritance : List{public StackInheritance() : base("stack"){}public void Push(object dataValue){InsertAtFront(dataValue);}public object Pop(){return RemoveFromFront();}}}
客戶端調用。
public static void Main(string[] args){StackInheritance stack = new StackInheritance();bool aBoolean = true;char aChar = 'a';int anInt = 12;string aStr = "hello";stack.Push(aBoolean);stack.Display();stack.Push(aChar);stack.Display();stack.Push(anInt);stack.Display();stack.Push(aStr);stack.Display();try{while (true){object removedObject = stack.Pop();Console.WriteLine(removedObject + "被彈出~~");stack.Display();}}catch (EmptyListException emptyListException){Console.Error.WriteLine(emptyListException.StackTrace);}Console.ReadKey();}
參考資料:
Visual C# 2008大學教程--(第三版)
“了解集合本質必須要知曉的概念”系列包括:
1 這裡就是指棧(stack),堆(heap)和棧是兩個概念
2 你理解的沒錯,局部變量是在棧上分配的,具有局部作用域,程序自動管理,堆上的數據具有全局作用域,需要手工回收。
堆棧的定義是這樣的:
dssg segment stack
aa dw 512dup(?)
dssg ends
一般的說,當PUSH/POP指令不頻繁時用系統堆棧就可以了,但是當需要堆棧存儲大量數據,如作為子程序傳替參數時就要定義一個堆棧,而且一般來說一個段的內容不能超過64K,因為偏移地址最大只能表示64K,所以定義的堆棧也不能是無限大,如果超過了64K,就定義兩個吧!
堆棧在匯編中對於初學者用的很少,一般小程序都不需要用的!用起來也不是很難,就是注意下,在子程序調用時,什麼時候是返回地址,什麼時候是寄存器值!總之,記住先進後出,再做題時畫個堆棧圖,應該不會很難的!