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

กลับลำดับ Stack ใน C#

ภาพรวม

Stack<T> เป็น LIFO (Last-In-First-Out) การ Reverse Stack คือการ Pop จาก Stack เดิมแล้ว Push เข้า Stack ใหม่

โค้ดตัวอย่าง


using System;
using System.Collections.Generic;

public class Program {
    public static void Main() {
        var stack = new Stack<char>();
        stack.Push('P');
        stack.Push('Q');
        stack.Push('R');

        Console.WriteLine("Original Stack (Top to Bottom):");
        foreach (char c in stack) Console.Write($"{c} ");
        // Output: R Q P (Top is R)

        // Reverse: Pop from original, Push to new
        var reversed = new Stack<char>();
        while (stack.Count > 0) {
            reversed.Push(stack.Pop());
        }

        Console.WriteLine("\n\nReversed Stack (Top to Bottom):");
        foreach (char c in reversed) Console.Write($"{c} ");
        // Output: P Q R (Top is P)
    }
}

ผลลัพธ์


Original Stack (Top to Bottom):
R Q P

Reversed Stack (Top to Bottom):
P Q R

วิธีอื่นๆ

1. ใช้ Array.Reverse (ถ้าเข้าถึง Internal Array ได้ - ไม่ได้ใน Stack<T>)

Stack<T> ไม่ expose internal array ต้อง Pop/Push ทีละตัว

2. ใช้ LINQ (สร้างใหม่)


var reversed = new Stack<char>(stack.Reverse());
// Stack Constructor รับ IEnumerable - เพิ่มทีละตัวจาก First to Last
// ดังนั้น Reversed Stack จะมี Top = Original Bottom

3. Extension Method


public static class StackExtensions {
    public static Stack<T> Reverse<T>(this Stack<T> source) {
        var reversed = new Stack<T>();
        foreach (var item in source) {
            reversed.Push(item);
        }
        return reversed;
    }
}

// ใช้งาน
var reversed = stack.Reverse();

Non-Generic Stack (Legacy)


using System.Collections;

Stack st = new Stack();
st.Push('P');
st.Push('Q');
Stack rev = new Stack();
while (st.Count > 0) rev.Push(st.Pop());

ประสิทธิภาพ

  • Time: O(n) - ต้อง Pop/Push ทุก element
  • Space: O(n) - Stack ใหม่ขนาดเท่าเดิม
  • In-place reversal ไม่ได้ใน Stack (ไม่มี Random Access)

กรณีพิเศษ: Reverse เองใน Stack เดียว (In-place simulation)


// ใช้ Array ช่วย
var temp = stack.ToArray(); // Copy to array (Top first)
stack.Clear();
foreach (var item in temp.Reverse()) { // Reverse array
    stack.Push(item);
}