Sử dụng Stack trong Java? | How to to use Stack in Java?

Bài viết này tôi sẽ giải thích về Stack, cũng như cách sử dụng nó trong ngôn ngữ lập trình Java, nếu có gì sai xót thì mong được sử đóng góp của các bạn.

Java Stack là gì? - What is Java Stack?

Stack dịch theo nghĩa tiếng việt có nghĩa cọng rơm, và tất nhiên ta sẽ không dùng nghĩa này mà ta dùng theo từ dịch chuyên ngành có nghĩa là ngăn xếp. Trong bài viết này ta sẽ tìm hiểu về Stack trong ngôn ngữ lập trình Java.

Theo định nghĩa trong lập trình Stack là một cấu trúc dữ liệu, dùng để lưu trữ nhiều đối tượng(phần tử dữ liệu) làm việc theo cơ chế "vào sau, ra trước" (Last In/First Out (LIFO)).

Bạn có thể liên tưởng tới việc lấy một cái ống bị bịt kín một đầu, sau đó cho một viên bị có số thứ tự là 1 vào đầu tiên, và làm tuần tự cho tới viên bi thứ 9, sau đó bạn muốn lấy viên bị thứ nhất ra thì phải làm như thế nào? Tất nhiên bạn phải lấy tuần tự viên bị thứ 9 ra, thứ 8 ra,... , cho tới khi lấy được viên bi thứ 1, như vậy bạn có thể xem cái ống là Stack và các viên bi trong ống là các phần tử của nó.

Trong đời sống bạn có thể bắt gặp nhiều ví dụ điển hình của Stack. Ví như chồng đĩa CD được xếp chồng trong hộp dĩa có cây cột chính giữa, bạn muốn lấy cái dĩa cuối cùng thì phải lấy tất cả những cái dĩa trên cùng ra trước, hay như thỏi kẹo, băng đạn của súng ngắn, súng AK,...



Các lệnh cơ bản của Stack. - The basic command of the Stack.

  • Push : thêm 1 phần tử vào đỉnh Stack
  • Pop : lấy 1 phần tử từ đỉnh Stack
  • Peek: trả về phần tử đầu Stack mà không loại bỏ nó ra khỏi Stack
  • isEmpty: Kiểm tra Stack có rỗng ko?
  • Search: trả về vị trí phần tử trong Stack tính từ đỉnh stack nếu ko thấy trả về -1


Ví dụ đơn giản các lệnh của Stack. - Example basic command of Stack.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package stackexample;

import java.util.Stack;

/**
 *
 * @author bnson
 */
public class stackexample{

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        //Khởi tạo một Stack.
        Stack<Integer> s = new Stack<Integer>();
       
        //Thêm một phần tử vào Stack.
        //Vòng lập for mô tả hoạt động đầu vào của Stack
        System.out.println("-- Vào sau/Last in --");
        for(int i = 1; i < 10 ; i++){
            System.out.println("Postion " + i + ": " + i);
            s.push(i);
        }

        //Khi ta sử dụng lệnh POP để remove giá trị đầu tiên,
        //ta thấy giá trị 9 vào sau cùng sẽ được xử lý trước tiên.
        //Đoạn mã bên dưới ngoài việc mô tả hoạt đông vào sau ra trước của Stack,
        //Còn xử lý loại bỏ tất cả các phần tử trong Stack khiến nó trở thành mảng rỗng.
        System.out.println("");
        System.out.println("-- Ra trước/First Out --");
        while(!s.isEmpty()) {
            System.out.println("Postion Poll: " + s.pop());
        }
       
        //Kiểm tra Stack có rỗng không? | Check Stack is empty?
        System.out.println("");
        System.out.println("-- Stack is empty: " + s.empty());
               
       
        //Do Stack đã là rỗng nên ta sẽ add lại giá trị cho nó,
        //để hướng dẫn các câu lệnh tiếp theo.
        System.out.println("");
        System.out.println("-- Thêm lại giá trị vào Stack. --");
        for(int i = 1; i < 10 ; i++){
            System.out.println("Postion " + i + ": " + i);
            s.push(i);
        }
       
        //Sử dụng phương thức search để duyệt quả mảng,
        //mà không loại bỏ các giá trị trong mảng.
        System.out.println("-- In các giá trị trong Stack. --");
        for(int i = 1; i < s.size() ; i++){
            System.out.println("Postion " + i + ": " + s.search(i));
        }
       
       
        //Sử dụng lện PEEK trả về phần tử đầu tiên của Stack, nhưng không loại bỏ nó ra khỏi Stack.
        //Tuy nhiên có một nhược điểm là không thể sử dụng nó để xem được giá trị của các phần tử khác,
        //vì nó luôn luôn trả về mỗi giá trị đầu tiên của Stack.
        System.out.println("");
        System.out.println("-- Peek: " + s.peek());

        System.out.println("");
        System.out.println("-- Tìm kiếm đối tượng trong Stack. | Search item in Stack. --");
        //Tra ve một vi tri trong stack tinh tu dau stack neu ko co tra ve -1.
        System.out.println("Search found:= " + s.search(2));
        System.out.println("Search not found:= " + s.search(20));

        System.out.println("");
        System.out.println("");
        System.out.println("                        -- VNLIVES.NET -- ");
       
       
    }
   
}


Kết quả. - Result.

-- Vào sau/Last in --
Postion 1: 1
Postion 2: 2
Postion 3: 3
Postion 4: 4
Postion 5: 5
Postion 6: 6
Postion 7: 7
Postion 8: 8
Postion 9: 9

-- Ra trước/First Out --
Postion Poll: 9
Postion Poll: 8
Postion Poll: 7
Postion Poll: 6
Postion Poll: 5
Postion Poll: 4
Postion Poll: 3
Postion Poll: 2
Postion Poll: 1

-- Stack is empty: true

-- Thêm lại giá trị vào Stack. --
Postion 1: 1
Postion 2: 2
Postion 3: 3
Postion 4: 4
Postion 5: 5
Postion 6: 6
Postion 7: 7
Postion 8: 8
Postion 9: 9
-- In các giá trị trong Stack. --
Postion 1: 9
Postion 2: 8
Postion 3: 7
Postion 4: 6
Postion 5: 5
Postion 6: 4
Postion 7: 3
Postion 8: 2

-- Peek: 9

-- Tìm kiếm đối tượng trong Stack. | Search item in Stack. --
Search found:= 8
Search not found:= -1


                        -- VNLIVES.NET --



Writer: +Bui Ngoc Son




No comments:

Post a Comment