You are on page 1of 42

Thuật toán và cấu trúc dữ liệu

Chương 03: Giới thiệu về Collections -


Ngăn xếp

Giảng viên: Lê Thị Hoàng Anh


Email: anhlth@nuce.edu.vn
1
Nội dung
1. Các khái niệm cơ bản
– Giới thiệu Collection
– Lập trình Generics
– Xử lý ngoại lệ
2. Ngăn xếp – STACK
– Giới thiệu ngăn xếp
– Kiểu dữ liệu trừu tượng ngăn xếp
– Cài đặt ngăn xếp bằng mảng ArrayStack
– Giới thiệu lớp Stack<E> trong Java
– Ứng dụng stack trong đánh giá biểu thức hậu tố
2
Giới thiệu Collections
• Collections là một tập hợp các lớp, interface
mục đích dùng để:
– Biểu diễn một danh sách các thông tin dữ liệu.
– Có khả năng tự co giãn khi danh sách đó thay
đổi (thêm,xóa, chèn các phần tử đối tượng dữ
liệu).
– Do tính tự co giãn nên khi sử dụng collections ta
không cần khai báo trước số lượng phần tử.
– Mục đích của Collections là để hỗ trợ việc thao
tác trên tập các đối tượng dữ liệu một cách hiệu
quả, hiệu năng cao. 3
Giới thiệu Collections
• Collections có thể được chia thành hai loại:
– Collection tuyến tính (linear collection)
– Collection không tuyến tính(nonlinear collection)

4
Giới thiệu Collections
• Cách tổ chức các phần tử trong một
collection phụ thuộc vào hai yếu tố:
– Thứ tự mà các phần tử được thêm vào
collection.
– Một số mối quan hệ vốn có giữa chính các
phần tử (ví dụ cây tìm kiếm nhị phân).

5
Giới thiệu Collections
• Java Collections Framework:
– Là một tập hợp các giao diện và các lớp
triển khai nhằm lưu trữ và khai thác hiệu
quả các dữ liệu biểu diễn bằng tập hợp hay
đồ thị.
– Ngoài ra Java Collections Framework còn
cho phép người dùng mở rộng các kiểu dữ
liệu Collection bằng cách kế thừa từ các
class hay interface để tạo ra bộ thư viện
riêng phù hợp với nhu cầu.
6
Giới thiệu Collections
• Tất cả các collection framework trong Java đều
chứa:
– Interfaces.
– Implementations(ví dụ như các class).
– Algorithms.
• Mặc dù là một framework nhưng nó hoạt động
như một thư viện lập trình gồm các công việc:
– Định nghĩa ra giao diện lập trình ứng dụng cho các
Collection.
– Hiện thực hóa chúng. (Implement)
– Áp dụng các thuật toán cho các phương thức.
7
Giới thiệu Collections

• Một số Java Interface Collection:

• Một số Java Class Collection:

8
Giới thiệu Collections

shareprogramming.net 9
Giới thiệu Collections
• Lợi ích mà Java Collections Framework
đem lại:
– Giảm công sức lập trình
– Tăng tốc độ và chất lượng chương trình
– Cho phép tương tác giữa các API không liên
quan
– Giảm công sức tìm hiểu và sử dụng các API
mới.
– Giảm công sức thiết kế các API mới
– Thúc đẩy tái sử dụng phần mềm
10
Collection với Stream API
• Hỗ trợ mạnh các thao tác thông thường
như:
– Duyệt collection, lọc dữ liệu, sắp xếp, ánh xạ
dữ liệu…
• Một Stream API hoạt động trên collection
sẽ trải qua 3 đoạn chính:
– Khởi tạo stream
– Hoạt động trung gian (Intermediate Operations)
– Hoạt động cuối (Terminal Operatons)

11
Collection với Stream API
• Ví dụ:

12
Collection với Stream API
• Bài tập:
Cho các phần tử {8,7,9,11,8,11,20,15,7}
- Hãy khởi tạo mảng danh sách.
- Thêm các phần tử trên vào mảng danh
sách.
- Đếm xem trong danh sách có bao nhiêu
phần tử lớn hơn 11.

13
Tham khảo
• Collection trong Java
https://hocjava.com/collections-trong-java-
moi-thu-ban-phai-biet/
• Biểu thức Lambda
https://viblo.asia/p/nam-ro-java-lambda-
expression-cho-nguoi-moi-bat-dau-
RQqKLNwbl7z

14
Lập trình Generics
• Generics là cách thức lập trình tổng quát
cho phép một object hoạt động với nhiều
kiểu dữ liệu khác nhau.
• Thuật ngữ generics nghĩa là tham số hóa
kiểu dữ liệu. Điều này rất quan trọng vì nó
cho phép chúng ta tạo và sử dụng một
class, interface, method với nhiều kiểu dữ
liệu khác nhau.
• Khái niệm Generics được đưa vào Java từ
phiên bản 5
15
Lập trình Generics
• Tại sao nên dùng generics?
– Ví dụ 1: Có nên viết nhiều hàm áp dụng cho
nhiều kiểu dữ liệu khác nhau?
• public String toString(int a) {return ""+a;}
• public String toString(long a) {return ""+a;}
• public String toString(double a) {return ""+a;}
• …
– Cách giải quyết?
• public <T> String toString(T a){return ""+a;}

16
Lập trình Generics
• Ví dụ 1:

17
Lập trình Generics
– Ví dụ 2: Collection Generics

18
Lập trình Generics
• Một số quy ước (nên theo) về cách đặt tên
cho kiểu tham số trong Generics:

19
Xử lý ngoại lệ
• Ví dụ:

20
Nội dung
1. Các khái niệm cơ bản
– Giới thiệu Collection
– Lập trình Generics
– Xử lý ngoại lệ
2. Ngăn xếp – STACK
– Giới thiệu ngăn xếp
– Kiểu dữ liệu trừu tượng ngăn xếp
– Cài đặt ngăn xếp bằng mảng ArrayStack
– Giới thiệu lớp Stack<E> trong Java
– Ứng dụng stack trong đánh giá biểu thức hậu tố
21
Giới thiệu STACK
• Ngăn xếp là một cấu trúc dữ liệu trừu
tượng hoạt động theo nguyên lý LIFO
(Last-In-First-Out).

GV: Lê Thị Hoàng Anh 22


Giới thiệu STACK
• Mảng là cấu trúc dữ liệu truy cập
ngẫu nhiên, danh sách liên kết là
truy cập tuần tự còn với stack là
cấu trúc dữ liệu truy cập bị giới
hạn (limited access).
• Danh sách ngăn xếp là một cấu
trúc dữ liệu đệ quy. Các đối tượng
được lưu trữ trong ngăn xếp theo
nguyên tắc thêm và xóa khỏi ngăn
xếp chỉ ở trên cùng (top của ngăn
xếp)
GV: Lê Thị Hoàng Anh 23
Các thao tác cơ bản
• Ngăn xếp có hai thao tác cơ bản:
– push: Thêm một phần tử vào đầu ngăn xếp.
– pop: Xóa một phần tử phía trên đầu ngăn xếp.

GV: Lê Thị Hoàng Anh 24


Các thao tác cơ bản
• Ngoài ra còn một số thao tác như:
– empty: Kiểm tra ngăn xếp có rỗng hay không?
– peek: Lấy thông tin phần tử ở đầu ngăn xếp
mà không xóa nó khỏi ngăn xếp.
– search:
• Trả về vị trí đối tượng tìm kiếm xuất hiện trong
Stack (khoảng cách tính từ đỉnh stack).
• Trả về -1 nếu không tồn tại.

GV: Lê Thị Hoàng Anh 25


Ứng dụng của ngăn xếp
• Đảo ngược một chuỗi.
• Thực hiện các thao tác Undo ví dụ như cơ
chế undo trong các trình soạn thảo văn
bản text editors.
• Dùng để lưu trữ dữ liệu cho các thuật toán
quay lui (Backtracking).
• Định trị biểu thức. Chuyển đổi biểu thức:
Tiền tố, hậu tố, trung tố.

GV: Lê Thị Hoàng Anh 26


Ứng dụng của ngăn xếp
• Hỗ trợ cho các xử lý của ngôn ngữ lập
trình:
– Tạo ra không gian lưu trữ cho các tham số
của hàm/phương thức (chương trình con) và
các biến cục bộ.
– Hỗ trợ cơ chế gọi hàm trong giải thuật đệ quy.
– Kiểm tra cú pháp của trình biên dịch cho các
dấu ngoặc trong biểu thức.
– .v..v.

GV: Lê Thị Hoàng Anh 27


Kiểu dữ liệu trừu tượng ngăn xếp
• Trong nội dung bài học này chúng ta sẽ
xây dựng một kiểu dữ liệu ngăn xếp cài
đặt giao diện StackADT như sau:

28
Kiểu dữ liệu trừu tượng ngăn xếp
• Cài đặt interface:

29
Cài đặt ngăn xếp bằng mảng
• Cài đặt class ArrayStack thực thi interface
StackADT:
public class ArrayStack<T> implements
StackADT<T>
{ …//Các thuộc tính&phương thức định nghĩa
//ở đây
}
• Các thuộc tính:

30
Cài đặt ngăn xếp bằng mảng
• Các hàm tạo

31
Cài đặt ngăn xếp bằng mảng
• Hàm mở rộng sức chứa cho mảng

• Hàm trả về kích thước số phần tử

• Hàm kiểm tra stack rỗng


32
Cài đặt ngăn xếp bằng mảng
• Thao tác push

• Thao tác pop

33
Cài đặt ngăn xếp bằng mảng
• Thao tác peek:

34
Giới thiệu class Stack<E> trong java
• Nằm trong gói java.util.Stack<E>
• Lớp Stack<E> cài đặt thực thi các interface:
– Serializable
– Cloneable
– Iterable<E>
– Collection<E>
– List<E>
– RandomAccess

35
Giới thiệu class Stack<E> trong java
• Các phương thức cơ bản

36
Ứng dụng stack trong biểu thức hậu tố
• Biểu thức hậu tố là gì?
– Các biểu thức đại số được sử dụng hàng
ngày đều được biểu diễn dưới dạng trung tố
(infix).
– Biểu thức hậu tố đặt toán tử ra sau các toán
hạng.
– Cách biểu diễn này gọi là ký pháp nghịch đảo
Ba Lan Reverse Polish Notation (RPN)

37
Biểu thức hậu tố
• Một số ví dụ:

38
Chuyển biểu thức trung tố sang hậu tố
• Giải thuật sử dụng stack

39
Ứng dụng stack định trị biểu thức hậu tố
• Cài đặt giải thuật

40
Ứng dụng stack định trị biểu thức hậu tố
• Cài đặt giải thuật

41
Thảo luận

42

You might also like