Collection framework trong Java cung cấp một lớp Stack để mô hình hóa cấu trúc dữ liệu Stack. Lớp này cũng vẫn hoạt động dựa theo cơ chế LIFO (Last In First Out). Tức là, phần tử nào được thêm vào đầu tiên thì sẽ được lấy ra sau cùng.
Tóm Tắt
1. Hệ thống phân cấp của lớp Stack
Lớp Stack là lớp con của lớp Vector, lớp Vector implement từ interface List.
Image Source: GeeksforGeeks
Lớp Stack chỉ hỗ trợ duy nhất một constructor mặc định để tạo một Stack rỗng.
Stack stack = new Stack();
2. Các phương thức cơ bản trên lớp Stack
E push(E item)
: Thêm một phần tử trên đỉnh của ngăn xếp.synchronized E pop()
: Xóa và trả về phần tử trên đỉnh của ngăn xếp. MộtEmptyStackException
sẽ bắn ra nếu ngăn xếp rỗng.synchronized E peek()
: Trả về phần tử trên đỉnh của ngăn xếp nhưng không xóa nó. MộtEmptyStackException
sẽ bắn ra nếu ngăn xếp rỗng.boolean empty()
: Trả vềtrue
nếu ngăn xếp rỗng, ngược lại trả vềfalse
.synchronized int search(Object o)
: Xác định xem một đối tượng có tồn tại trong ngăn xếp hay không? Nếu tìm thấy sẽ trả về vị trí của đối tượng tính từ đỉnh của ngăn xếp, ngược lại trả về-1
.
2.1. Duyệt các phần tử của Stack
Bạn có thể duyệt các phần tử của Stack bằng phương thức iterator()
.
StackExample
package com.icancodeit.data_structure.stack.in_java; import java.util.Iterator; import java.util.Stack; public class StackExample { public static void main(String[] args) { Stack<Integer> s = new Stack<Integer>(); for (int i = 0; i < 5; i++) { s.push(i); } Iterator<Integer> iterator = s.iterator(); while (iterator.hasNext()) { Integer val = iterator.next(); System.out.println(val); } } }
Kết quả
0 1 2 3 4
2.2. Thao tác với Stack bằng Stream API
Bạn cũng có thể thao tác với các phần tử trong Stack bằng cách sử dụng Stream API.
StackExample
package com.icancodeit.data_structure.stack.in_java; import java.util.Stack; import java.util.stream.Stream; public class StackExample { public static void main(String[] args) { Stack<Integer> s = new Stack<Integer>(); for (int i = 0; i < 5; i++) { s.push(i); } Stream<Integer> stream = s.stream(); stream.forEach(item -> System.out.println(item)); } }
Kết quả
0 1 2 3 4
2.3. Đảo ngược một List bằng Stack
Bạn có thể sử dụng Stack để đảo ngược các phần tử của một List. Đầu tiên sẽ xóa từng phần tử của List và đẩy vào Stack cho tới khi List rỗng. Sau đó lại xóa từng phần tử khỏi Stack và đẩy trả về List.
ReverseList
package com.icancodeit.data_structure.stack.in_java; import java.util.ArrayList; import java.util.List; import java.util.Stack; public class ReverseList { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < 5; i++) { list.add(i); } System.out.println("Before reverse: " + list); Stack<Integer> stack = new Stack<Integer>(); while (list.size() > 0) { stack.push(list.remove(0)); } while (stack.size() > 0) { list.add(stack.pop()); } System.out.println("After reverse: " + list); } }
Kết quả
Before reverse: [0, 1, 2, 3, 4] After reverse: [4, 3, 2, 1, 0]
Đọc thêm:
https://www.geeksforgeeks.org/stack-class-in-java/
http://tutorials.jenkov.com/java-collections/stack.html