Constructor Stack<T>(IEnumerable<T> collection) สร้าง Stack ใหม่โดยคัดลอกองค์ประกอบจากคอลเลกชันที่ระบุ **ลำดับจะถูกกลับด้าน** เพราะ Stack เป็น LIFO (Last-In-First-Out) - องค์ประกอบสุดท้ายของคอลเลกชันต้นทางจะอยู่บนสุด (Top) ของ Stack
ตัวอย่างที่ 1: Stack<int> จาก Stack อื่นผ่าน ToArray()
using System;
using System.Collections.Generic;
public class Demo
{
public static void Main()
{
Stack<int> stack = new Stack<int>();
stack.Push(100);
stack.Push(200);
stack.Push(300);
stack.Push(400);
stack.Push(500);
stack.Push(600);
stack.Push(700);
stack.Push(800);
stack.Push(900);
stack.Push(1000);
Console.WriteLine("Stack องค์ประกอบ (Top -> Bottom)...");
foreach (int val in stack)
{
Console.WriteLine(val);
}
// สร้าง Stack ใหม่จาก Array ของ Stack เดิม
Console.WriteLine("\nArray องค์ประกอบ (Bottom -> Top)...");
Stack<int> arr = new Stack<int>(stack.ToArray());
foreach (int val in arr)
{
Console.WriteLine(val);
}
}
}
ผลลัพธ์ (สังเกตลำดับกลับด้าน)
Stack องค์ประกอบ (Top -> Bottom)...
1000
900
800
700
600
500
400
300
200
100
Array องค์ประกอบ (Bottom -> Top)...
100
200
300
400
500
600
700
800
900
1000
ตัวอย่างที่ 2: Stack<string>
using System;
using System.Collections.Generic;
public class Demo
{
public static void Main()
{
Stack<string> stack = new Stack<string>();
stack.Push("Katie");
stack.Push("Andy");
stack.Push("Ariane");
stack.Push("Justin");
Console.WriteLine("Stack องค์ประกอบ (Top -> Bottom)...");
foreach (string val in stack)
{
Console.WriteLine(val);
}
Console.WriteLine("\nArray องค์ประกอบ (Bottom -> Top)...");
Stack<string> arr = new Stack<string>(stack.ToArray());
foreach (string val in arr)
{
Console.WriteLine(val);
}
}
}
ผลลัพธ์
Stack องค์ประกอบ (Top -> Bottom)...
Justin
Ariane
Andy
Katie
Array องค์ประกอบ (Bottom -> Top)...
Katie
Andy
Ariane
Justin
การทำงานของ Constructor Stack(IEnumerable)
- อ่านคอลเลกชันต้นทาง **ตามลำดับ** (First to Last)
- Push ทีละตัวเข้า Stack ใหม่
- ผลลัพธ์: **องค์ประกอบสุดท้ายของคอลเลกชันต้นทาง = Top ของ Stack ใหม่**
- ในตัวอย่าง: `stack.ToArray()` คืนค่า Array เรียง Bottom->Top, Constructor Push ตามลำดับนั้น ทำให้ Stack ใหม่มี Top = ตัวสุดท้ายของ Array = Bottom ของ Stack เดิม
Constructor Overloads ของ Stack<T>
| Constructor | คำอธิบาย |
Stack() | สร้างว่าง |
Stack(int capacity) | สร้างว่าง ระบุ Capacity เริ่มต้น |
Stack(IEnumerable<T> collection) | สร้างจากคอลเลกชันอื่น (กลับลำดับ) |
เมธอดหลักของ Stack<T>
| เมธอด | คำอธิบาย |
Push(T) | เพิ่มที่ Top |
Pop() | นำออกและคืนค่าที่ Top (โยน Exception ถ้าว่าง) |
Peek() | ดูที่ Top โดยไม่เอาออก (โยน Exception ถ้าว่าง) |
Clear() | ลบทั้งหมด |
Contains(T) | ตรวจสอบว่ามีสมาชิกหรือไม่ O(n) |
Count | จำนวนสมาชิก |
ToArray() | คืน Array เรียง Bottom -> Top |
ข้อสังเกต
- Stack เป็น LIFO (Last-In-First-Out) - ใส่ท้าย ดูท้าย เอาท้าย
- Constructor จาก IEnumerable **กลับลำดับ** ให้เหมาะกับ LIFO
- Non-Generic
Stack (System.Collections) มี Constructor เหมือนกัน แต่ใช้ object
- แนะนำใช้
Stack<T> (Generic) สำหรับ Type Safety และ Performance
- .NET ไม่มี
ConcurrentStack<T> ใน BCL (มีใน System.Collections.Concurrent แค่ ConcurrentStack)