You are on page 1of 44

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

Chương 05: Hàng đợi

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


Email: anhlth@nuce.edu.vn
1
Nội dung
1. Khái niệm hàng đợi
– Giới thiệu hàng đợi
– Ứng dụng của hàng đợi
2. Hàng đợi trong Java API
3. Kiểu dữ liệu trừu tượng hàng đợi

2
Nội dung
4. Cài đặt hàng đợi
– Cài đặt hàng đợi bằng danh
sách liên kết
– Cài đặt hàng đợi bằng mảng
5. Ví dụ minh họa

3
Giới thiệu QUEUE
• Queue là một cấu trúc dữ liệu trừu tượng
hoạt động theo nguyên lý FIFO (First-In-
First-Out).
Người xếp hàng đầu tiên sẽ là người đầu tiên được mua vé

4
Giới thiệu QUEUE
• Cũng giống như stack thì queue cũng là
cấu trúc dữ liệu tuyến tính được truy cập
hạn chế.
• Có số phần tử động (có thể dễ dàng thay
đổi kích thước)
• Mỗi queue có hai điểm truy cập là
– Front: Là điểm truy cập tới các phần tử cũ
nhất. (Còn gọi là head)
– Rear: Là điểm truy cấp tới các phần tử mới
nhất. (Còn gọi là tail)
5
Tổ chức danh sách hàng đợi
• Một đầu dùng để thêm các phần tử vào
danh sách hàng đợi gọi là rear
• Một đầu dùng để xóa các phần tử ra khỏi
danh sách hàng đợi gọi là front

6
Các thao tác cơ bản
• Hàng đợi có hai thao tác cơ bản:
– Enqueue: Thêm một phần tử vào cuối danh
sách hàng đợi.
– Dequeue: Xóa một phần tử ở đầu danh sách
hàng đợi

7
Các thao tác cơ bản
• Ngoài ra còn một số thao tác như:
– isEmpty: Kiểm tra hang đợi có rỗng hay
không?
– Peek: Lấy thông tin phần tử ở đầu hàng đợi
mà không xóa nó khỏi hàng đợi.
– Count: Hàm lấy kích thước hàng đợi (Hay số
lượng phần tử đang có trong hàng đợi)

8
Ứng dụng của queue
• Ứng dụng trong các bài toán lập lịch của
hệ điều hành (CPU Scheduling) và tác vụ
truy xuất đĩa (Disk Scheduling).
• Xử lý các ngắt (interrupt) trong hệ thống
thời gian thực.
• Khi dữ liệu được truyền không đồng bộ
giữa hai tiến trình (process) thì queue
được dùng để đồng bộ nó. Ví dụ: print
spooling, …
9
Ứng dụng của queue
• Hai kỹ thuật tìm kiếm trên cây tìm kiếm
chúng ta có thể dùng stack và queue:
– Tìm kiếm theo chiều sâu sử dụng stack
(Depth-First Search)
– Tìm kiếm theo chiều rộng sử dụng queue
(Breadth-First Search)
• Kết hợp cả queue và stack trong chuyển
đổi biểu thức: tiền tố, trung tố và hậu tố từ
đó chúng ta có thể định trị được biểu thức

10
Nội dung
1. Khái niệm hàng đợi
– Giới thiệu hàng đợi
– Ứng dụng của hàng đợi
2. Hàng đợi trong Java API
3. Kiểu dữ liệu trừu tượng hàng đợi

11
Hàng đợi trong JAVA API
• Java Collections API không nhất quán
trong cách thực thi collection hàng đợi
(queue).
• Có một số điểm khác biệt trong cách ngăn
xếp và hàng đợi được java triển khai thực
thi:
– Java Collections API cung cấp lớp
java.util.Stack để thực thi collection ngăn xếp,
trong khi đó hàng đợi không được cài đặt bằng
lớp Queue mà chỉ cung cấp interface Queue.
12
Hàng đợi trong JAVA API
– Lớp Stack cung cấp cách cài đặt các thao tác
truyền thống như Push, Pop và Peek. Trong
khi đó interface Queue<E> không cài đặt thao
tác truyền thống như Enqueue, Dequeue và
First.
– Thay vào đó interface Queue<E> định nghĩa
hai cách khác nhau để thêm phần tử vào
queue và hai cách khác nhau để loại bỏ phần
tử ra khỏi queue và cung cấp một phương
thức tương đương cho các khái niệm như first
hay peek của queue.
13
Hàng đợi trong JAVA API
• Interface Queue<E> cung cấp hai phương
thức khác nhau để thêm một phần tử vào
hàng đợi:
– add(E e): Thao tác này sẽ thêm phần tử vào hàng
đợi nếu dung lượng bộ nhớ đang có sẵn và ném
ra ngoại lệ illegalStateException nếu không gian
bộ nhớ không có sẵn. Nếu thêm thành công, giá
trị trả về là true.
– offer(E e): Thao tác này sẽ thêm phần tử vào
hàng đợi nếu đủ không gian nhớ. Nếu thêm thành
công, giá trị trả về là true. Ngược lại là false.
14
Hàng đợi trong JAVA API
• Interface Queue<E> cũng cung cấp hai
phương thức khác nhau để xóa một phần tử
ra khỏi hàng đợi:
– poll(): Trả về phần tử và loại nó ra khỏi queue
hoặc trả về giá trị null nếu queue rỗng.
– remove(): Trả về phần tử và loại nó ra khỏi
queue. Nếu queue rỗng sẽ ném ra ngoại lệ.
• Các phương thức trong interface Queue<E>
được cài đặt rải rác không chỉ bởi một lớp
mà bởi nhiều lớp trong đó có LinkedList.
15
Nội dung
1. Khái niệm hàng đợi
– Giới thiệu hàng đợi
– Ứng dụng của hàng đợi
2. Hàng đợi trong Java API
3. Kiểu dữ liệu trừu tượng hàng đợi

16
Kiểu dữ liệu trừu tượng hàng đợi

• Trong nội dung bài học này, chúng ta sẽ


xây dựng kiểu dữ liệu hàng đợi cài đặt
giao diện QueueADT như sau:

17
Kiểu dữ liệu trừu tượng hàng đợi
• Cài đặt kiểu dữ liệu trừu tượng hàng đợi

18
Nội dung
4. Cài đặt hàng đợi
– Cài đặt hàng đợi bằng danh
sách liên kết
– Cài đặt hàng đợi bằng mảng
5. Ví dụ minh họa

19
Cài đặt hàng đợi bằng danh sách liên kết

• Cài đặt class LinkedQueue thực thi


interface QueueADT:
public class LinkedQueue <E> implements
QueueADT<E>
{
//Các thuộc tính & phương thức định nghĩa ở đây
}
• Các thuộc tính:

20
Cài đặt hàng đợi bằng danh sách liên kết

• Hàm tạo Hàm lấy về số phần tử

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

21
Cài đặt hàng đợi bằng danh sách liên kết

• Thêm phần tử vào đầu hàng đợi

22
Cài đặt hàng đợi bằng danh sách liên kết

• Xóa phần tử ra khỏi hàng đợi

23
Cài đặt hàng đợi bằng danh sách liên kết

• Xem thông tin của phần tử đầu tiên trỏ bởi


head:

24
Cài đặt hàng đợi bằng mảng
• Để cài đặt hàng đợi bằng mảng chúng ta quy định:
– Chỉ số của mảng bắt đầu từ 0, mỗi lần thêm thì thêm vào
cuối mảng nên chỉ số tăng lên một. Do vậy chỉ số rear
cũng tăng lên một. Để chuẩn bị cho việc thêm này phần tử
rear luôn nằm sau phần tử cuối cùng để khi thêm vào rear
cho tiện.
– Mỗi lần xóa sẽ xóa ở chỉ số trước tiên của mảng tại đầu
front.
• Tổ chức queue bằng mảng

25
Cài đặt hàng đợi bằng mảng
• Chúng ta sẽ sử dụng mảng vòng để cài
đặt queue

26
Cài đặt hàng đợi bằng mảng
• Các trường hợp xử lý

27
Cài đặt hàng đợi bằng mảng

28
Cài đặt hàng đợi bằng mảng
• Cài đặt class CircularArrayQueue thực thi
interface QueueADT:
public class CircularArrayQueue <E>
implements QueueADT<E>
{
//Các thuộc tính & phương thức định nghĩa ở đây
}
• Các thuộc tính:

29
Cài đặt hàng đợi bằng mảng
• Hàm tạo

30
Cài đặt hàng đợi bằng mảng
• Hàm mở rộng sức chứa cho mảng

31
Cài đặt hàng đợi bằng mảng
Hàm kiểm tra mảng rỗng Hàm số phần tử

Xem thông tin của phần tử đầu tiên

32
Cài đặt hàng đợi bằng mảng
• Thêm phần tử vào đầu hàng đợi

33
Cài đặt hàng đợi bằng mảng
• Xóa phần tử ra khỏi hàng đợi

34
Nội dung
4. Cài đặt hàng đợi
– Cài đặt hàng đợi bằng danh
sách liên kết
– Cài đặt hàng đợi bằng mảng
5. Ví dụ minh họa

35
Ví dụ minh họa
• Cho danh sách những vũ công gồm cả
nam và nữ như sau: (Với M là nam và F là
nữ)

36
Ví dụ minh họa
• Hãy sử dụng hàng đợi để nhập vào máy
tính hai danh sách là nam riêng và nữ
riêng.
• Hãy ghép các cặp đôi theo thứ tự và đưa
ra màn hình. (Một cặp đôi gồm một nam
và một nữ)

37
Ví dụ minh họa
• Ta sử dụng một class Dancer để làm việc
với một vũ công như sau:

38
Ví dụ minh họa
• Hàm nhập dữ liệu vào cho bài toán

39
Ví dụ minh họa
• Hàm tạo ra hai hàng đợi nam và nữ

40
Ví dụ minh họa
• Hàm ghép cặp đôi vũ công

41
Ví dụ minh họa
• Chương trình chính

42
Ví dụ minh họa

• Kết quả:

43
Thảo luận

44

You might also like