Cấu Trúc Dữ Liệu Và Giải Thuật Chapter 4.2 Queue Trong Lập Trình Tài Liệu Bao Gồm 6 Chapter Mong các bạn theo dõi đầy đủ để đạt kết quả cao . Để Cập Nhật Thêm Tìm Hiểu Hơn Nữa Về Tài Liệu IT Thì Các Bạn Có Thể Truy Cập : https:123doc.orgtrangcanhan4336953tailieuit.htm CẢM ƠN CÁC BẠN ĐÃ THEO DÕI
Trang 1Phần 2: Hàng đợi (Queue)
Trang 22
Hàng đợi ( Queue)
Theo cơ chế FIFO (First In First Out)
Các đối tượng có thể được thêm vào hàng đợi bất
kỳ lúc nào
Chỉ có đối tượng thêm vào đầu tiên mới được phép lấy ra khỏi hàng đợi
Trang 3Giới thiệu
Vào, ra dữ liệu:
Trang 5Biếu diễn Queue
Kích thước stack
khi quá thiếu, lúc
quá thừa
Cấp phát động!
Push / Pop hơi
phức tạp
Push/Pop khá dễ dàng
Trang 66
Biểu diễn Queue dùng mảng
Biểu diễn một Queue bằng mảng:
Mảng một chiều Ary lưu các phần tử dữ liệu
Hằng số N cho biết kích thước (số phần tử tối đa) của hàng đợi
Hai biến nguyên front, rear cho biết chỉ số của đầu và cuối của hàng đợi
Trang 7typedef struct item
{
int data ;
};
Biểu diễn Queue bằng mảng
typedef struct queue
{
int front, rear;
Cấu trúc một phần tử dữ liệu
Cấu trúc hàng
đợi
Trang 8179/44
Các thao tác cơ bản trên Queue
Khởi tạo Queue: Init (q)
Kiểm tra Queue rỗng: IsEmpty (q)
Kiểm tra Queue đầy: IsFull (q)
Thêm phần tử vào Queue: Add(q, x)
Lấy phần tử ra khỏi Queue: Remove (q)
8
Biểu diễn Queue bằng mảng
Trang 9Biểu diễn Queue dùng mảng
Khởi tạo Queue:
Lệnh khởi tạo front = 0 và rear = 0 sẽ tạo ra một
queue rỗng
Đảm bảo các thao tác trên queue thực hiện đúng đắn
Thuật toán:
+Vào: Queue cần khởi tạo
+ Ra: Queue sau khi khởi tao
Trang 1010
Biểu diễn Queue dùng mảng
Cài đặt:
int IsEmpty(Queue q) {
if (q.front > q.rear)
return 1;
return 0;
}
Kiểm tra Queue rỗng:
Được gọi đến trước khi thực hiện thao tác lấy một
phần tử ra khỏi queue
Queue rống nếu front = 0 hoặc front > rear
Thuật toán:
+ Ra: giá trị 0 hoặc 1
B1) if front = 0 or front > rear
then return 1;
else return 0;
BKT) Kết thúc;
Trang 11Biểu diễn Stack dùng mảng
Kiểm tra Queue đầy
Được gọi đến trước khi thực hiện thao tác đưa một phần tử vào queue
Queue đầy nếu rear= N-1
Cài đặt:
int IsFull (queue q) {
if (q.rear==N-1) return 1;
return 0;
Thuật toán:
+ Ra: giá trị 0 hoặc 1
B1) if rear= N-1 then return 1;
else return 0;
BKT) Kết thúc;
Trang 1212
Biểu diễn Stack dùng mảng
Thêm một phần tử vào queue
Việc thêm phần tử luôn được thực hiện ở cuối hàng đợi
Thuật toán
Vào: Queue q, phần tử dữ liệu x
Ra: q với phần tử dữ liệu x ở cuối hàng đợi
B1) Kiểm tra nếu queue đầy thì thực hiện BKT;
Ngược lại, thực hiện B2;
B2) lưu phần tử dữ liệu x vào queue:
2.1) Tăng rear lên 1;
2.2) Giá trị phần tử với chỉ số rear = x;
BKT) Kết thúc;
Trang 13Biểu diễn Queue dùng mảng
Thêm một phần tử vào hàng đợi
Void Add (queue &q, item x){
if (!Full(q)) //Queue chưa đầy
Trang 1414
Lấy phần tử ra khỏi queue
Thuật toán
Vào: Queue q;
Ra: Giá trị phần tử cuối hàng đợi x
B1) Kiểm tra nếu queue rỗng thì thực hiện BKT; Ngược lại, thực hiện B2;
B2) Lấy phần tử ra khỏi hàng đợi
2.1) x giá trị phần tử ở đầu hàng đợi (front); 2.2) Tăng chỉ số fron lên 1;
BKT) Kết thúc;
Biểu diễn Queue dùng mảng
Trang 15Lấy một phần tử ra khỏi hàng đợi
Trang 1616
Nhận xét:
Ưu điểm:
• Các thao tác trên queue làm việc với chi phí O(1)
• Việc cài đặt queue thông qua mảng một chiều đơn giản và khá hiệu quả
Hạn chế:
• Giới hạn về kích thước của queue N
• Giá trị của N có thể quá nhỏ so với nhu cầu thực tế hoặc quá lớn sẽ làm lãng phí bộ nhớ
Khắc phục: Sử dụng DSLK đơn để biểu diễn queue
Biểu diễn Queue dùng mảng
Trang 17 Cĩ thể tạo một hàng đợi sử dụng một DSLK đơn
Phần tử đầu DSKL (pHead) sẽ là phần tử đầu hàng đợi, phần tử cuối DSKL (pTail) sẽ là phần
tử cuối hàng đợi
a 1 a 2 a N-2 a n-1 Đầu hàng
Cuối hàng
a 0
Biểu diễn Queue bằng DSLK
Trang 19Các thao tác cơ bản trên Queue
Khởi tạo queue: Init (q)
Kiểm tra queue rỗng: IsEmpty (q)
Tạo mới một nút chứa dữ liệu x: CreateNode(x)
Thêm phần tử vào queue: Add(q, x)
Lấy phần tử ra khỏi queue: Remove (q)
Biểu diễn Queue bằng DSLK
Trang 2020
Biểu diễn Queue dùng mảng
Khởi tạo Queue:
Lệnh khởi tạo front = rear = NULL sẽ tạo ra một
queue rỗng
Thuật toán:
+Vào: Queue cần khởi tạo
+ Ra: Queue sau khi khởi tao
B1) Gán front = rear = NULL
Trang 21Biểu diễn Queue dùng mảng
Cài đặt:
int IsEmpty(Queue q) {
if (q.front == NULL)
return 1;
return 0;
}
Kiểm tra Queue rỗng:
Queue rỗng nếu front = NULL
Thuật toán:
+ Ra: giá trị 0 hoặc 1
B1) if front = NULL then return 1;
else return 0;
BKT) Kết thúc;
Trang 23Biểu diễn Stack dùng mảng
Thêm một phần tử vào queue
Việc thêm phần tử luôn được thực hiện ở cuối hàng đợi
Thuật toán
Vào: Queue q, phần tử dữ liệu x
Ra: q với phần tử dữ liệu x ở cuối hàng đợi
B1) NewNode Tạo mới nút chứa dữ liệu x;
B2) Nếu tạo nút thành công thì
- Kiểm tra nếu front = NULL thì
front = rear = NewNode
Trang 2424
Biểu diễn Stack dùng mảng
B3) Ngược lại, chèn vào cuối danh sách:
+ q.rear->Next = NewNode;
+ q.rear = NewNode;
BKT) Kết thúc;
Trang 25Thêm một phần tử vào queue
Trang 2626
Lấy phần tử ra khỏi queue
Thuật toán
Vào: Queue q;
Ra: Phần tử ở đầu hàng đợi p
B1) Kiểm tra nếu queue rỗng thì thực hiện BKT; Ngược lại, thực hiện B2;
B2) Lấy phần tử ra khỏi hàng đợi
2.1) p giá trị phần tử ở đầu hàng đợi (front); 2.2) Điều chỉnh front = front->Next;
BKT) Kết thúc;
Biểu diễn Queue dùng mảng
Trang 27Lấy phần tử ra khỏi queue
Trang 29Sử dụng Queue
Hàng đợi có thể được sử dụng trong một số
bài toán:
Bài toán „sản xuất và tiêu thụ‟ (ứng dụng trong
các hệ điều hành song song)
Bộ đệm (ví dụ: Nhấn phím Bộ đệm CPU
xử lý)
Xử lý các lệnh trong máy tính (ứng dụng trong
HĐH, trình biên dịch), hàng đợi các tiến trình chờ được xử lý, …