Ngăn xếp (Stack)
Ngăn xếp (stack) là cấu trúc "vào sau ra trước" (LIFO). Đơn giản nhưng có mặt khắp nơi: nút Undo, ngăn xếp lời gọi hàm, duyệt DFS, kiểm tra ngoặc. Mọi thao tác đều O(1).
1. Trực quan: chồng đĩa
Stack giống chồng đĩa: bạn chỉ thêm/lấy ở đỉnh. Đĩa đặt sau cùng lại là đĩa được lấy đầu tiên. Đó là LIFO — Last In, First Out (vào sau, ra trước).
push 30 ▼ ▲ pop (lấy 30 ra trước)
┌────────┐
│ 30 │ ← đỉnh (top)
├────────┤
│ 20 │
├────────┤
│ 10 │ ← đáy
└────────┘
2. Ba thao tác (đều O(1))
| Thao tác | Ý nghĩa | Độ phức tạp |
|---|---|---|
| push(x) | thêm x lên đỉnh | O(1) |
| pop() | lấy & bỏ phần tử đỉnh | O(1) |
| peek() | xem đỉnh, không lấy ra | O(1) |
Vì chỉ động vào đỉnh, không phải dịch gì → tất cả O(1).
3. Chạy debug: push rồi pop
Bước qua để thấy LIFO: phần tử vào sau (3) ra trước.
4. Cài đặt: dùng mảng động là đủ
Trong Python, list với append/pop (cuối) chính là stack — cả hai O(1):
Lưu ý: dùng
append/popở CUỐI mảng (O(1)). Đừng dùngpop(0)(đầu, O(n)) cho stack.
5. Vì sao stack quan trọng?
Stack mô hình hoá "việc đang làm dở, quay lại sau". Máy tính dùng nó cho ngăn xếp lời gọi hàm (nhớ bài 1.3.2 — mỗi lời gọi push một khung). Đệ quy thực chất là một stack ẩn. Bạn sẽ gặp lại stack ở DFS, kiểm tra ngoặc, undo... (bài 2.3.4).
6. Mẫu nhận diện
- "Hoàn tác (undo)", "quay lui", "khớp cặp gần nhất", "đảo ngược" → nghĩ tới stack.
- Cần xử lý phần tử mới nhất trước → LIFO → stack.
- Đệ quy ↔ stack: bài đệ quy thường viết lại được bằng vòng lặp + stack thủ công.
7. 🎮 Trò chơi: Hiểu stack
8. Quiz kiểm tra nhanh
9. Hoàn thành
…☑️ Tiếp theo: 2.3.2 — Hàng đợi (Queue) (FIFO — ngược với stack).