堆疊 - Stack 類別

堆疊是一種後進先出的資料結構,這種資料堆放的方式很像疊硬幣,當你將硬幣一個一個往上疊,最後放的硬幣會被疊在最上面,而當硬幣一個一個被拿下來時,最後放上去的,會最先被取走。



上圖說明堆疊結構的資料存取行為,假設有五個元素,從元素 A ~ 元素 E ,依序被放入集合當中,最後被放進去的元素E,位於堆疊的最上層,當集合中的元素逐一被取出,元素 E 被第一個取出,最先進入的元素 A 最後一個被取出。

Stack 類別提供堆疊結構支援,同時實作 ICollection 、 IEnumerable 以及 ICloneable 這三個介面,本身亦是一個動態集合,建構式包含三個多載的版本,最簡單的版本並沒有接受任何參數。

你也可以引用另外一個版本的建構式,其接受一個用以指定堆疊物件初始容量的參數值,形式如下:
public Static(int intCapacity)
其中的 intCapacity 為集合物件建立時,指定的初始容量。

Stack 類所定義的方法成員當中,最重要的兩個方法為 Push 以及 Pop ,另外還有一個 Peek 也必須了解 。

Push

將一個物件放到堆疊的最頂端,而以下為方法 Push 的定義:
public virtual void Push(object obj);
這個方法所接受的object 參數 obj ,為加入堆疊最頂端的物件,利用這個方法,你甚至可以將一個null 的空物件加入到堆疊集合,這樣作的話,會在堆疊裏預留一個空的位置,Stack 類別物件亦將這個 null 值當作物件作處理。

Pop

將位於堆疊最頂端的物件取出:
public virtual Object Pop()
Pop 將取出的集合元素以 Object 回傳,你必須注意避免對一個空的堆疊集合引用這個方法,並且捕捉其可能產生的 InvalidOperationException 例外。

Peek

類似 Pop ,回傳一個位於堆疊最頂端的物件,但是不會將其從集合中移除,其定義如下:
public virtual Object Peek()

Clear

除了單一元素的存取,如果想一次清除Stack當中的所有物件元素,可以直接呼叫 Clear ,這個方法的定義如下:
public virtual void Clear()
Clear 將集合清空之後,同時會將 Count 屬性設為 0 ,表示目前的集合中沒有任何元素。

接下來的程式碼,我們來看看如何建立一個Stack類別物件,並且於其中加入物件元素,然後引用方法逐一列舉其內容。
// StackDemo

class Program
{
    static void Main(string[] args)
    {
        int firstNumber = 10;
        int secondNumber = 20;
        int thirdNumber = 30;
        int forthNumber = 40;
        int fifthNumber = 50;

        Stack stack = new Stack();
        Console.WriteLine("使用方法 Push 將物件加入堆疊 : \n");

        Console.WriteLine("加入第一個數值 10: ");
        stack.Push(firstNumber);
        Console.WriteLine("加入第二個數值 20: ");
        stack.Push(secondNumber);
        Console.WriteLine("加入第三個數值 30: ");
        stack.Push(thirdNumber);
        Console.WriteLine("加入第四個數值 40: ");
        stack.Push(forthNumber);
        Console.WriteLine("加入第五個數值 50: ");
        stack.Push(fifthNumber);

        Console.WriteLine();

        Console.WriteLine("使用方法 Peek 從堆疊取得物件 : \n");
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine(stack.Peek());
        }
        Console.WriteLine("堆疊內目前的物件數目: {0}\n", stack.Count);

        Console.WriteLine(
            "使用方法 Pop 從堆疊取得物件,並且將其移走 : \n");
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine(stack.Pop());
        }
        Console.WriteLine("堆疊內目前的物件數目 : {0}\n", stack.Count);
        Console.ReadLine();
    }
}
建立一個 Stack 類別實體物件 stack ,連續引用Stack 類別提供的方法 Push ,將指定的數值加入 stack 物件所。 接下來利用廻圈 for 引用 Peek 取出集合中的物件元素,此方法只是單純的取得物件的值,並不會將其從集合中移走,因此迴圈每一次取得的元素均為最後一次加入的數值 10 ,集合中的物件數目則永遠均是 5 。 

接下來另一段迴圈引用 Pop 取出堆疊元素,此方法自集合中取出物件後同時移除,因此物件取出的順序剛好與加入的順序相反,也就是後進先出的排列順序。 

使用方法 Push 將物件加入堆疊 :
加入第一個數值 10:
加入第二個數值 20:
加入第三個數值 30:
加入第四個數值 40:
加入第五個數值 50:

使用方法 Peek 從堆疊取得物件 :

50
50
50
50
50
堆疊內目前的物件數目: 5

使用方法 Pop 從堆疊取得物件,並且將其移走 :

50
40
30
20
10
堆疊內目前的物件數目 : 0
被加入的五個整數,依相反順序逐一被取出,Peek 方法取出的均是同一個值,也就是最後加入的 50,而 Pop則依堆疊規則反向取出。




沒有留言: