Stack แบบ Beginner-First: เข้าใจ LIFO และใช้แก้โจทย์จริง
บทนี้พาคุณเรียน Stack ตั้งแต่แนวคิดพื้นฐานไปจนถึง pattern สำคัญ เช่น bracket matching, monotonic stack และความเชื่อมโยงกับ recursion
1) Stack คืออะไร
Stack คือโครงสร้างข้อมูลที่เข้าถึงและแก้ไขข้อมูลได้ที่ปลายด้านเดียวเท่านั้น
Mental model: นึกภาพกองจานซ้อนกัน หยิบได้จากใบบนสุด
Recap: Stack คือโครงสร้างข้อมูลแบบปลายเดียว
2) แนวคิด LIFO คืออะไร
LIFO ย่อมาจาก Last In, First Out คือเข้าหลังออกก่อน
Mental model: ของที่วางล่าสุดจะอยู่บนสุดและถูกหยิบก่อน
Recap: LIFO คือกฎหลักที่ทำให้ Stack ต่างจาก Queue
3) โครงสร้างพื้นฐานของ Stack
Stack พื้นฐานมี container เก็บข้อมูลและ operation หลักไม่กี่ตัว
Mental model: มีช่องหลักแค่ push, pop, peek, isEmpty, size
Recap: API เล็กแต่ใช้งานได้กว้างมาก
4) Top ของ Stack คืออะไร
Top คือสมาชิกตัวบนสุดที่พร้อมถูกอ่านหรือเอาออก
Mental model: ปลาย active ของ stack อยู่ที่ top เสมอ
Recap: ทุก operation หลักทำงานรอบ top
5) การทำงานของ push
push คือการเพิ่มข้อมูลใหม่เข้าไปบนสุดของ stack
Mental model: วางจานเพิ่มบนกองเดิม
เพิ่มสมาชิกใหม่ขึ้นบนสุด
Recap: push เพิ่มข้อมูลที่ top
6) การทำงานของ pop
pop คือการนำสมาชิกบนสุดออกและคืนค่านั้น
Mental model: หยิบจานบนสุดออกจากกอง
ดึง top ออก หากว่างจะได้ undefined
Recap: pop เปลี่ยนโครงสร้าง stack และลดขนาดลง
7) การทำงานของ peek / top
peek คืออ่านสมาชิกบนสุดโดยไม่ลบออก
Mental model: มองดูจานบนสุดโดยไม่หยิบ
อ่าน top โดยไม่แก้ stack
Recap: peek ใช้เช็กสถานะก่อนตัดสินใจ pop
8) การตรวจว่า stack ว่างหรือไม่
เช็กจากขนาดว่าเป็น 0 หรือไม่
Mental model: ไม่มีสมาชิกแปลว่า stack ว่าง
คืน true เมื่อไม่มีสมาชิก
Recap: isEmpty เป็นเงื่อนไขพื้นฐานก่อน pop/peek
9) การหาขนาดของ stack
อ่านจำนวนสมาชิกทั้งหมดใน stack
Mental model: นับจำนวนจานที่ซ้อนอยู่ตอนนี้
คืนจำนวนสมาชิกทั้งหมด
Recap: size ช่วยกำหนดเงื่อนไข loop และ stop condition
10) Stack ต่างจาก Array ยังไง
Array เข้าถึง index ได้อิสระ แต่ Stack จำกัดการใช้งานให้ทำงานที่ปลายด้านเดียว
Mental model: Stack เป็นกฎการใช้งานบน container ไม่ใช่แค่โครงสร้างเก็บข้อมูล
Recap: Stack ช่วยบังคับรูปแบบการใช้ข้อมูลให้ถูกโจทย์
11) Stack สร้างจาก Array ได้ยังไง
ใช้ array เป็น backing store แล้ว expose เฉพาะ push/pop/peek
Mental model: ซ่อน method ที่ไม่ต้องการเพื่อรักษากติกา LIFO
Recap: implementation ด้วย array ทำง่ายและนิยมที่สุด
12) Stack สร้างจาก Linked List ได้ยังไง
ใช้ head เป็น top ของ stack แล้วทำ push/pop ที่ head เพื่อให้ O(1)
Mental model: head คือ top ของ stack ใน linked-list implementation
ใช้ head เป็น top
Recap: linked list เหมาะเมื่ออยากเลี่ยงการขยาย capacity ของ array
13) Time Complexity ของ push / pop / peek
operation หลักของ stack ปกติเป็น O(1)
Mental model: แตะเฉพาะ top จึงไม่ต้องเดินทั้งโครงสร้าง
Recap: จุดแข็งของ stack คือ operation คงที่ที่ปลายเดียว
14) Use case ของ Stack
เช่น undo/redo, bracket matching, backtracking, parsing expression
Mental model: งานที่ต้องย้อนกลับ step ล่าสุดเหมาะกับ LIFO
Recap: ถ้าโจทย์พูดถึงย้อนลำดับล่าสุด ให้คิดถึง stack ก่อน
15) Function call stack คืออะไร
runtime ใช้ call stack เก็บ frame ของฟังก์ชันที่กำลังทำงาน
Mental model: เรียกฟังก์ชันใหม่คือ push frame, return คือ pop frame
Recap: call stack คือ stack ที่ภาษาใช้จริงทุกโปรแกรม
16) Stack กับ recursion เกี่ยวกันยังไง
แต่ละ recursion call จะสร้าง frame ใหม่ใน call stack จนถึง base case แล้วทยอยคืน
Mental model: recursion คือการใช้ stack แบบอัตโนมัติโดย runtime
Recap: recursion ลึกเกินไปอาจเกิด stack overflow
17) การใช้ Stack ตรวจวงเล็บ
push วงเล็บเปิด และ pop เพื่อตรวจจับคู่เมื่อเจอวงเล็บปิด
Mental model: วงเล็บต้องปิดย้อนลำดับตามตัวเปิดล่าสุด
ตรวจวงเล็บเปิด-ปิดด้วย stack
Recap: balanced parentheses เป็นโจทย์ stack คลาสสิก
18) การใช้ Stack กลับลำดับข้อมูล
push ข้อมูลทั้งหมดแล้ว pop ออกเพื่อได้ลำดับกลับด้าน
Mental model: LIFO ทำให้ของท้ายกลายเป็นของหน้า
Recap: reverse คือผลลัพธ์ธรรมชาติของ stack
19) Monotonic Stack เบื้องต้น
Monotonic stack คือ stack ที่รักษาลำดับเพิ่มหรือลดเพื่อแก้โจทย์ next greater/smaller
Mental model: pop องค์ประกอบที่ไม่สอดคล้องกับ monotonic rule
Recap: เทคนิคนี้ลด nested loop หลายโจทย์จาก O(n²) เป็น O(n)
20) การประเมินนิพจน์ด้วย Stack เบื้องต้น
ใช้ stack ช่วย parse ตัวเลข/operator ตามลำดับความสำคัญพื้นฐาน
Mental model: เก็บสิ่งที่ยังคำนวณไม่เสร็จไว้ใน stack
Recap: expression parsing มักใช้ stack มากกว่า 1 กอง
21) Infix / Prefix / Postfix เบื้องต้น
Infix คือ `A+B`, Prefix คือ `+AB`, Postfix คือ `AB+` ซึ่ง stack มักใช้กับ postfix evaluation
Mental model: รูปแบบนิพจน์ต่างกันที่ตำแหน่ง operator
Recap: postfix เหมาะกับการคำนวณด้วย stack แบบตรงไปตรงมา
22) เปรียบเทียบ Stack vs Queue
Stack เป็น LIFO ส่วน Queue เป็น FIFO จึงเหมาะกับโจทย์คนละแบบ
Mental model: Stack = ย้อนล่าสุด, Queue = คิวตามลำดับมาก่อน
Recap: เลือกตามกฎเข้าออกของข้อมูลที่โจทย์ต้องการ
23) ข้อดีของ Stack
API ง่าย, operation หลัก O(1), เหมาะกับงานย้อนกลับและ parsing
Mental model: เรียบง่ายแต่พลังสูงในโจทย์ที่รูปแบบชัด
Recap: Stack ใช้งานง่ายและคาดเดาประสิทธิภาพได้ดี
24) ข้อจำกัดของ Stack
เข้าถึงข้อมูลตรงกลางไม่ได้โดยตรง และใช้ได้เฉพาะปลายบนสุดเป็นหลัก
Mental model: ถ้าต้อง random access บ่อย stack ไม่ใช่ตัวเลือกที่ดี
Recap: Stack จงใจจำกัดความยืดหยุ่นเพื่อรักษากฎ LIFO
25) โจทย์ฝึก Stack ระดับเริ่มต้น
Exercise 1: เขียนคลาส Stack พื้นฐาน
โจทย์: สร้าง `push`, `pop`, `peek`, `isEmpty`, `size` ให้ครบ
Hint: ใช้ `items: number[] = []` ก่อน แล้วห่อ method เป็น API ของ stack
Exercise 2: ตรวจวงเล็บสมดุล
โจทย์: เขียนฟังก์ชันรับสตริงวงเล็บและคืน `true/false`
Hint: เจอวงเล็บเปิดให้ push, เจอวงเล็บปิดให้ pop เทียบคู่
Exercise 3: Reverse ข้อความด้วย Stack
โจทย์: รับข้อความแล้วคืนข้อความกลับด้าน
Hint: push ตัวอักษรทั้งหมด แล้ว pop ต่อสตริงผลลัพธ์
Exercise 4: Next Greater Element แบบง่าย
โจทย์: หาค่าที่มากกว่าถัดไปของแต่ละตำแหน่ง
Hint: เริ่มจาก monotonic stack ลดลง และเดินจากขวาไปซ้าย
ถ้าต้องการฝึกแบบมี runtime checks ให้ไป Stack Lab ซึ่งเรียงโจทย์จาก operation พื้นฐานจนถึงการตรวจวงเล็บด้วยหลักการ stack
ไปหน้า Stack Lab26) ข้อผิดพลาดที่พบบ่อยในการใช้ Stack
เช่น pop ตอน stack ว่าง, ลืมเช็ก isEmpty, เข้าใจ LIFO ผิด, และลืมเคลียร์ state ระหว่าง test case
Mental model: ก่อน pop/peek ให้เช็กความว่างทุกครั้ง
Recap: บั๊ก stack มักมาจาก edge case ตอนโครงสร้างว่าง