Stack (สแต็ก) เป็นโครงสร้างข้อมูลแบบ LIFO (Last In, First Out) - ข้อมูลที่เข้าไปทีหลังจะออกก่อน
ออปเปอเรชันหลักของ Stack
- Push: เพิ่มข้อมูลด้านบน (Top)
- Pop: ลบข้อมูลด้านบน (Top)
- Peek/Top: ดูข้อมูลด้านบนโดยไม่ลบ
โครงสร้าง Node
struct Node {
int data;
Node* next;
};
Node* top = nullptr; // จุดชี้ด้านบนของสแต็ก
โค้ดโปรแกรม Stack ด้วย Linked List
#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
};
Node* top = nullptr;
void push(int val) {
Node* newNode = new Node();
newNode->data = val;
newNode->next = top; // ชี้ไป node เก่าที่ top
top = newNode; // top ชี้มาที่ node ใหม่
cout << val << " pushed." << endl;
}
void pop() {
if (top == nullptr) {
cout << "Stack Underflow!" << endl;
return;
}
Node* temp = top;
cout << "Popped: " << top->data << endl;
top = top->next; // top ชี้ไป node ถัดไป
delete temp; // ปล่อยหน่วยความจำ
}
void display() {
if (top == nullptr) {
cout << "Stack is empty" << endl;
return;
}
Node* ptr = top;
cout << "Stack (top to bottom): ";
while (ptr != nullptr) {
cout << ptr->data << " ";
ptr = ptr->next;
}
cout << endl;
}
int main() {
int choice, val;
do {
cout << "\n1. Push\n2. Pop\n3. Display\n4. Exit\nChoice: ";
cin >> choice;
switch (choice) {
case 1:
cout << "Enter value: ";
cin >> val;
push(val);
break;
case 2:
pop();
break;
case 3:
display();
break;
case 4:
cout << "Exiting..." << endl;
break;
default:
cout << "Invalid choice!" << endl;
}
} while (choice != 4);
// ทำความสะอาด
while (top != nullptr) pop();
return 0;
}
ผลลัพธ์ตัวอย่าง
1. Push 2. Pop 3. Display 4. Exit Choice: 1 Enter value: 10 10 pushed. Choice: 1 Enter value: 20 20 pushed. Choice: 3 Stack (top to bottom): 20 10 Choice: 2 Popped: 20 Choice: 3 Stack (top to bottom): 10 Choice: 4 Exiting...
การทำงานของ Push และ Pop
Push (เพิ่มข้อมูล)
Top → [New] → [Old] → [Old] → NULL
↑
newNode->next = top
top = newNode
Pop (ลบข้อมูล)
Top → [Old] → [Old] → NULL
↑
temp = top
top = top->next
delete temp
ข้อดีของ Linked List Stack
- Dynamic Size: ไม่มีข้อจำกัดขนาด (จนกว่าจะหมด RAM)
- No Overflow: ไม่ต้องกังวล Stack Overflow
- Memory Efficient: จองหน่วยความจำเฉพาะที่ใช้
เปรียบเทียบ Array vs Linked List Stack
| คุณสมบัติ | Array Stack | Linked List Stack |
|---|---|---|
| ขนาด | คงที่ (Fixed) | ไดนามิก (Dynamic) |
| Push/Pop Speed | เร็วกว่า (Cache friendly) | ช้ากว่าเล็กน้อย |
| Memory | จองล่วงหน้า | จองตามใช้ |
| Overflow Risk | มี | ไม่มี (จนกว่า RAM เต็ม) |