Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Stack ใน C++ STL: คู่มือการใช้งาน std::stack ครบถ้วน

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 ฯลฯ