ภาพรวม
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);
}