Stack – Lớp Stack trong Java

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.

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ột EmptyStackException 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ột EmptyStackException 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

Advertisement