Stack ใน C++ คืออะไร?
std::stack เป็น container adapter แบบ **LIFO (Last In First Out)** ใส่/ดึงข้อมูลจากด้านบน (top) เท่านั้น เหมือนกองจานหรือกองหนังสือ
โดยภายในใช้ deque (default), vector, หรือ list เป็น underlying container
Operations หลัก (ทั้งหมด O(1))
1. top() - ดูค่าด้านบน
int& top(); const int& top() const;
// คืน reference ไปยัง top element (undefined behavior ถ้า empty)
2. push(val) - ใส่ข้อมูล
void push(const T& val);
void push(T&& val); // C++11 move
3. pop() - ลบข้อมูลด้านบน
void pop(); // ไม่คืนค่า ต้อง top() ก่อนถ้าอยากได้ค่า
4. size() - จำนวนข้อมูล
size_type size() const;
5. empty() - ตรวจว่าว่างหรือไม่
bool empty() const;
ตัวอย่างการใช้งาน
#include <bits/stdc++.h>
using namespace std;
int main() {
stack<int> st;
// Push
st.push(10);
st.push(20);
st.push(30);
st.push(40);
// Check
if (!st.empty()) {
cout << "Stack size: " << st.size() << "\n"; // 4
}
// Pop ทั้งหมด (LIFO: 40, 30, 20, 10)
cout << "Elements: ";
while (!st.empty()) {
cout << st.top() << " ";
st.pop();
}
// Output: 40 30 20 10
return 0;
}
Output
Stack size: 4 Elements: 40 30 20 10
ข้อควรระวัง
- pop() ไม่คืนค่า - ต้อง
top()ก่อน pop - top() บน empty stack = UB - ต้องเช็ค
empty()ก่อน - ไม่มี iterator - ไม่สามารถ loop ผ่าน stack ได้โดยตรง
- ไม่มี clear() - ต้อง pop ทีละตัว หรือ assign ใหม่
st = stack<T>()
การประกาศด้วย Container อื่น
stack<int, vector<int>> st_vec; // ใช้ vector
stack<int, list<int>> st_list; // ใช้ list
สรุป
Stack เหมาะสำหรับ: Backtracking, Expression Evaluation, Parentheses Matching, DFS, Undo Mechanism ฯลฯ