Stack, Queue và Priority Queue trong Java (phần 1)


Stack, Queue và Priority Queue trong Java (phần 1)
Phần 1: Stack
Stack là gì?
Stack là một cách thức lưu trữ và lấy dữ liệu theo kiểu xếp chồng. Để dễ hình dung, giả sử bạn có 1 thùng dựng sách có chiều dài và chiều rộng vừa với cuốn sách, và chiều cao vừa đủ.
Bạn có 5 cuốn sách xếp theo thứ tự từ trái sang lần lượt là 1, 2, 3, 4, 5




Bây giờ, bạn đi lần lượt từ trái sang, mỗi lần đi đặt 1 cuốn sách vào thùng. Sau khi đi qua 5 cuốn sách, thùng sẽ như sau
Các bạn để ý một số điểm đặc biệt như sau:
1. Khi đưa sách vào, ta chỉ có thể đặt cuốn sách mới lên trên cuốn sách cũ
2. Nếu ta lấy sách ra, ta phải lấy theo thứ tự: Từ cuốn sách đặt cuối cùng (last) lấy ra trước (first) cho đến cuốn sách đặt đầu tiên (first) lấy ra sau (last)
=>Ta còn gọi nó là LIFO (Last In First Out – Vào cuối ra trước)
3. Thứ tự sách tính từ đỉnh (top) của stack tới đáy (bottom) của stack là 5, 4, 3, 2, 1 ngược với thứ tự ban đầu khi xếp từ trái sang 1, 2, 3, 4, 5
=>Đứa chạy đầu tiên sẽ đặt vào vị trí đáy, cho tới đứa chạy cuối cùng sẽ đặt vào vị trí đỉnh
Trong lập trình, người ta sử dụng nó để giải quyết một số bài toán đặc trưng
Trong Java, có hỗ trợ một lớp Stack dùng để thực hiện kiểu lưu trữ và lấy thông tin như thế này
Stack trong Java
Stack trong Java nằm trong java.util, cú pháp khai báo và khởi tạo như sau
Stack<Type> obj = new Stack<Type>();
Cách tương tác với các phần tử như sau:

push(): đưa phần tử vào trong stack, theo kiểu của stack – đưa vào đầu danh sách stack
pop(): đưa phần tử ra ngoài stack, theo kiểu của stack – trả về một giá trị tại vị trí nằm ở đầu danh sách stack, và xóa phần tử đó trong danh sách stack
peek(): xem (trả về) phần tử đầu tiên trong danh sách stack
    *Hàm peek() không xóa phần tử đầu tiên như pop()
Ngoài ba hàm trên, còn một số hàm dùng để tìm kiếm phần tử. Một số quy ước về vị trí ta cần biết như sau

Search position được tính theo khoảng cách của phần tử tính từ vị trí top, với phần tử đầu tiên bắt đầu bằng 1.
Index được tính từ đáy của danh sách, đếm bắt đầu từ 0.
Search position được dùng khi ta gọi hàm search(somethingObject). Cú pháp như sau
 obj.search(somethingObject);
Để đơn giản ta thử ví dụ như sau
Stack<Integer> listBook = new Stack<Integer>();
listBook.push(1);
listBook.push(2);
listBook.push(3);
listBook.push(4);
listBook.push(5);
Như ta thấy, sau khi push các cuốn sách từ 1 tới 5, ta nhận được 1 stack với phần tử tại đỉnh là cuốn sách số 5. Giả sử khi ta muốn tìm cuốn sách số 2 có search position là bao nhiêu, ta dùng hàm sau
listBook.search(new Integer(2));
Lúc đó ta trả về search position có giá trị là 4. Số 4 được xem là khoảng cách từ top đến vị trí cuốn sách số 2.
Tương tự như thế, index được dùng giống như khi mình sử dụng list, chỉ cần chú ý phần tử đầu tiên là đáy và bắt đầu từ 0
Ví dụ: listBook.get(1) -> Kết quả trả về là cuốn sách số 2
Hôm nay chúng ta đã xong bài viết về Stack rồi, đơn giản phải không nào!
Nội dung bài viết thuộc về Lê Công Diễn.

Người viết: Lê Công Diễn
Mang đi nhớ ghi nguồn



Nhận xét

Bài đăng phổ biến từ blog này

Deploy project Springboot MIỄN PHÍ sử dụng Render

Ứng dụng Mã hóa bất đối xứng (Asymmetric cryptography) vào Chữ ký số (Digital Signature)

API và HTTP - Một số khái niệm cơ bản cần biết về Web (Phần 2)