Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

สร้าง Stack จากคอลเลกชันใน C#

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)