สแตคคือโครงสร้างข้อมูลที่เก็บข้อมูลชนิดเดียวกัน ที่สามารถเพิ่มและลบข้อมูลได้ทางเดียวเท่านั้น คือด้านบน (top) ของสแตคเท่านั้น โดยข้อมูลที่เพิ่มหลังสุด จะเอาออกจากสแตคได้ก่อนข้อมูลที่เพิ่มมาก่อนหน้า (Last In First Out, LIFO) ตัวอย่างของสแตคในชีวิตประจำวัน เช่นสแตคของจานในโรงอาหาร สแตคของหนังสือ สแตคของวัตถุที่เรียงซ้อนกันเป็นชั้นๆ เป็นต้น
สแตคเป็นโครงสร้างข้อมูลที่ใช้บ่อยมากในระบบคอมพิวเตอร์ การเรียกใช้งานฟังก์ชันต่างๆของโปรแกรมซึ่งเกิดขึ้นตลอดเวลาที่โปรแกรมกำลังทำงานอยู่ ล้วนแล้วแต่เป็นการใช้งานสแตค การเขียนโปรแกรมแบบเรียกซ้ำ (recursion) และการเก็บคำสั่ง การยกเลิกคำสั่ง (Undo/Redo) ในโปรแกรมพิมพ์เอกสาร การตรวจสอบข้อผิดพลาดของโปรแกรมโดยคอมไพเลอร์ การแปลงนิพจน์จาก infix เป็น postfix และการหาค่าของนิพจน์ postfix evaluation เป็นต้น







เนื่องจากเราจะคุ้นเคยกับนิพจน์ infix มากกว่า postfix แต่ในการคำนวณค่าของนิพจน์ด้วยสแตค ต้องใช้นิพจน์ postfix เท่านั้น ดังนั้นเราจึงต้องทำการแปลงนิพจน์จาก infix เป็น postfix เสียก่อน ซึ่งสามารถทำได้โดยใช้สแตคเช่นเดียวกัน ตามอัลกอริทึมดังนี้
1. ถ้าอ่านเจอ operand ให้เก็บในสตริงของ postfix

การสร้างข้อมูลแบบสแตคจะใช้อาร์เรย์ หรือลิงค์ลิสต์ก็ได้ ถ้าใช้อาร์เรย์ซึ่งเป็นการจัดสรรพื้นที่หน่วยความจำแบบคงที่ ก็จะต้องมีการกำหนดขนาดของสแตคล่วงหน้าว่าจะมีขนาดเท่าใด แต่ถ้าสร้างสแตคด้วยลิงค์ลิสต์ซึ่งเป็นการจัดสรรหน่วยความจำแบบไม่จำกัด สแตคจะไม่เต็ม จะใส่ข้อมูลได้เรื่อยๆขึ้นอยู่กับหน่วยความจำที่เหลืออยู่
ตัวอย่างข้อมูลที่เก็บในสแตค เช่น ชนิดตัวอักษร (char) ข้อความ (string) จำนวนเต็ม (int) และจำนวนจริง (double)

// ArrayStack class
// Array-based implementation of the stack.
//
// CONSTRUCTION: with no initializer
//
// ******************PUBLIC OPERATIONS*********************
// void Push(x) --[>] Insert x
// void Pop( ) --[>] Remove most recently inserted item
// AnyType Top( ) --[>] Return most recently inserted item
// AnyType TopAndPop( ) --[>] Return and remove most recent item
// boolean IsEmpty( ) --[>] Return true if empty; else false
// void MakeEmpty( ) --[>] Remove all items
// ******************ERRORS********************************
// Top, Pop, or TopAndPop on empty stack
public static void stackOps(ArrayStack[] s)
{
Console.WriteLine("Push Stack: ");
for (int i = 0; i [<] 10; i++)
{
s.Push(i);
Console.Write("{0} ", i);
}
Console.WriteLine();
Console.WriteLine("Pop Stack: ");
while (!s.IsEmpty())
{
Console.Write(s.TopAndPop());
Console.Write(" ");
}
Console.WriteLine();
}
public static void Main(string[] args)
{
ArrayStack s1 = new ArrayStack ();
ArrayStack s2 = new ArrayStack ();
ArrayStack s3 = new ArrayStack ();
Console.WriteLine("Stack Example");
stackOps(s1);
// five names
Console.WriteLine("Push Stack");
Console.WriteLine("Enter 5 strings");
for (int i = 0; i [<] 5; i++)
{
Console.Write("Enter string {0}: ", i + 1);
s2.Push(Console.ReadLine());
}
//
Console.WriteLine("Pop Stack");
while (!s2.IsEmpty())
Console.WriteLine(s2.TopAndPop());
// reverse string
Console.WriteLine("Push String");
Console.Write("Enter a string: ");
string s = Console.ReadLine();
for (int i = 0; i[<]s.Length; i++)
{
s3.Push(s[i]);
}
//
Console.WriteLine("Pop String");
while (!s3.IsEmpty())
Console.Write(s3.TopAndPop());
Console.ReadKey();
}

2020. mnet50.com