Một cấu trúc dữ liệu Stack được hiểu là một danh sách các phần tử được sắp xếp theo nguyên tắc Last-In-First-Out (LIFO)1.
Nếu chúng ta coi stack như 1 chiếc ống có 1 đầu ra thì, chúng ta chỉ có thể thêm hoặc bỏ những phần tử ở trên cùng (top) và không thể thêm phần tử mới vào cuối ống.
Đây là một trong những cấu trúc dữ liệu cơ bản và cực kỳ quan trọng trong lập trình. Stack có rất nhiều ứng dụng, để trực quan các bạn có thể tưởng tượng một chồng sách, bạn chỉ có thể lấy ra quyển sách ở trên cùng của chồng sách, nếu bạn muốn lấy ra cuốn sách cuối cùng, bạn phải lấy ra hết các cuốn sách ở phía trên nó.
Cách triển khai
Bên trong Stack chúng ta có thể biểu diễn với dạng kiểu dữ liệu slice
của Golang. Ở đây tôi sẽ liệt kê những thao tác chính chúng ta có thể làm với một Stack
.
New()
: đóng vai trò như một phương thức khởi tạo mộtslice
nội bộ lưu trữ dữ liệu, trước khi chúng ta có thể sử dụng cấu trúc này.Push(item)
: thêm một phần tử mới ở vị trí trên cùng.Pop()
: lấy ra phần tử trên cùng.Len()
: trả về số lượng phần tử còn lại trong stack.
Codes
|
|
Test
|
|
Ứng dụng
- Tính giá trị biểu thức đại số hậu tố: Biểu thức đại số hậu tố là biểu thức có toán tử nằm sau 2 toán hạng của nó, cũng không có dấu ngoặc. Ví dụ như biểu thức hậu tố của
((4 + 2) / 3) + 5
sẽ là4 2 + 3 / 5 +
. Đầu tiên, duyệt biểu thức theo thứ tự từ trái sang phải, khi gặp toán hạng thì đẩy vào stack. Sau đó, khi gặp toán tử, ta lấy 2 toán hạng trên cùng trong stack ra và thực hiện phép toán rồi lại đẩy kết quả vào stack.
Vào sau ra trước. ↩︎