Cài đặt hàng đợi bằng con trỏ Linked list 11.4.. Cài đặt hàng đợi bằng con trỏ Linked list 11.4.. Khái niệm về hàng đợiTrong ứng dụng máy tính, định nghĩa CTDL hàng đợi là danh sách, t
Trang 1Lecture 11 – Hàng đợi (Queues)
11.1 Khái niệm về hàng đợi
11.2 Cài đặt hàng đợi bằng mảng
11.2.1 Các thao tác cơ bản
11.2.2 Các thao tác bổ trợ
11.3 Cài đặt hàng đợi bằng con trỏ (Linked list)
11.4 Vài ứng dụng của hàng đợi
11.4.1 Palindromes
11.4.2 Demerging
11.4.3 Tính giá trị của biểu thức
11.4 Bài tập thực hành
Trang 2Lecture 11 – Hàng đợi (Queues)
11.1 Khái niệm về hàng đợi
11.2 Cài đặt hàng đợi bằng mảng
11.2.1 Các thao tác cơ bản
11.2.2 Các thao tác bổ trợ
11.3 Cài đặt hàng đợi bằng con trỏ (Linked list)
11.4 Vài ứng dụng của hàng đợi
11.4.1 Palindromes
11.4.2 Demerging
11.4.3 Tính giá trị của biểu thức
11.4 Bài tập thực hành
Trang 311.1 Khái niệm về hàng đợi
Trang 411.1 Khái niệm về hàng đợi
Trong ứng dụng máy tính, định nghĩa CTDL hàng đợi là
danh sách, trong đó việc thêm một phần tử được thực hiện ở đầu một danh sách (cuối hàng đợi) và việc lấy ra một phần tử được thực hiện ở cuối danh sách (đầu hàng).
Hàng đợi còn được gọi là danh sách FIFO (First In First
Out).
Trang 511.1 Khái niệm về hàng đợi
Định nghĩa: Một hàng đợi các phần tử kiểu T là một chuỗi nối tiếp các phần tử của T và kèm theo một số tác vụ sau:
Tạo mới một đối tượng hàng rỗng;
Thêm một phần tử mới vào hàng, giả sử hàng đợi chưa đầy (phần tử dữ liệu mới luôn được thêm vào cuối hàng);
Loại một phần tử ra khỏi hàng, giả sử hàng chưa rỗng (phần
tử bị loại là phần tử tại đầu hàng, thường là phần tử vừa được xử lý xong);
Xem phần tử tại đầu hàng (phần tử sắp được xử lý)
Trang 611.1 Khái niệm về hàng đợi
Số lượng ứng dụng của hàng đợi không thua kém (hơn) ngăn xếp.
VD: khi máy tính làm việc, có nhiều hàng đợi chức năng khác nhau được sử dụng:
hàng đợi máy in;
việc truy xuất đĩa;
sử dụng CPU;
chuyển đổi từ Infix sang Prefix
thường gọi là front hay head
Phần tử mới thêm vào được gọi là rear hay tail
Trang 711.1 Khái niệm về hàng đợi
Một số dạng của hàng đợi :
Hàng đợi tuyến tính - Linear Queues
Tổ chức hàng đợi theo nghĩa thông thường
Hàng đợi vòng - Circular Queues
Giải quyết việc thiếu bộ nhớ khi sử dụng hàng đợi
Hàng đợi ưu tiên - Priority Queues
Mỗi phần tử có kết hợp thêm thông tin về độ ưu tiên
Khi chương trình cần lấy một phần tử khỏi hàng đợi, nó sẽ xét những phần tử có độ ưu tiên cao trước
Multi-Headed Queues.
Trang 8Lecture 11 – Hàng đợi (Queues)
11.1 Khái niệm về hàng đợi
11.2 Cài đặt hàng đợi bằng mảng
11.2.1 Các thao tác cơ bản
11.2.2 Các thao tác bổ trợ
11.3 Cài đặt hàng đợi bằng con trỏ (Linked list)
11.4 Vài ứng dụng của hàng đợi
11.4.1 Palindromes
11.4.2 Demerging
11.4.3 Tính giá trị của biểu thức
11.4 Bài tập thực hành
Trang 90 1 2 3 4 5 6 7
11.2 Cài đặt hàng đợi bằng mảng
Cài đặt hàng đợi bằng mảng tuyến tính :
Lúc khởi tạo hàng đợi rỗng: front = rear = -1
Lần lượt thêm các phần tử 0, 1, 2, 3: front = 0; rear = 3;
Lấy ra lần lượt 2 phần tử: front = 2; rear = 3;
Tiếp tục thêm vào 2 phần tử: front = 2; rear = 5;
Tiếp tục thêm vào 2 phần tử nữa: front = 2; rear = 7;
Hàng đợi đầy, không thể thêm được nữa;
Trang 1011.2 Cài đặt hàng đợi bằng mảng
Cài đặt:
Tạo mới một mảng với kích cỡ cho trước (n);
Dùng 2 biến front và rear để quản lý index của phần tử đầu
tiên và cuối cùng trong hàng đợi;
Thao tác khởi tạo hàng đợi: front = rear = -1;
Hàng đợi rỗng: front = rear;
Hàng đợi đầy: rear = n-1;
Cho phép thêm phần tử vào hàng đợi khi hàng đợi chưa đầy: rear = rear +1;
Cho phép xóa phần tử khi hàng đợi không rỗng: front = front + 1;
Trang 1111.2 Cài đặt hàng đợi bằng mảng
Một số nhận xét cho dạng Queue nói trên:
Đáp ứng được các tiêu chí về Queue.
Tuy nhiên, với kích thước Queue là 8 (theo ví dụ) chỉ có thể thêm tối đa 8 phần tử
Ngoài ra, vì front chỉ tăng, do đó, trong Queue vẫn còn ô
nhớ nhưng không sử dụng được
Giải quyết vấn đề trên:
Sử dụng Queue có dạng vòng.
Khi đó, làm thế nào để biết Queue đã đầy hay rỗng?
Giá trị khởi tạo cho front và rear như thế nào?
Xây dựng Queue như thế nào?
Trang 125 6
7
Trang 1311.2 Cài đặt hàng đợi bằng mảng
Cài đặt:
Tạo mới một mảng với kích cỡ cho trước (n);
Dùng 2 biến front và rear để quản lý index của phần tử đầu
tiên và cuối cùng trong hàng đợi;
Thao tác khởi tạo: front = rear = 0;
Hàng đợi rỗng: front = rear;
Hàng đợi đầy: (rear+1) mod n == front.
Cho phép thêm phần tử vào hàng đợi khi rear hàng đợi chưa đầy: rear = (rear + 1) mod n;
Cho phép xóa khi hàng đợi không rỗng:
front = (front + 1) mod n;
Trang 14Lecture 11 – Hàng đợi (Queues)
11.1 Khái niệm về hàng đợi
11.2 Cài đặt hàng đợi bằng mảng
11.2.1 Các thao tác cơ bản
11.2.2 Các thao tác bổ trợ
11.3 Cài đặt hàng đợi bằng con trỏ (Linked list)
11.4 Vài ứng dụng của hàng đợi
11.4.1 Palindromes
11.4.2 Demerging
11.4.3 Tính giá trị của biểu thức
11.4 Bài tập thực hành
Trang 16Khai báo cấu trúc dữ liệu
11.3 Cài đặt hàng đợi bằng DSLK
Trang 17Thêm một phần tử vào
hàng đợi
void Put(Queue &q, int x){
QueueNode ql = (QueueNode) malloc(sizeof(struct Node));
ql->info=x;
ql->next=NULL;
if(QueueEmpty(q)) {q.head=q.tail=ql;
}
else{q.tail->next=ql;
q.tail=ql;
}
11.3 Cài đặt hàng đợi bằng DSLK
Trang 18Xóa một phần tử ra khỏi
hàng đợi
int Get(Queue &q){
if(QueueEmpty(q))printf("Queue is empty!");
else{QueueNode temp=q.head;
int x=temp->info;
q.head=q.head->next;
if(temp->next=NULL) q.tail=NULL;
free(temp);
return x;
}}
11.3 Cài đặt hàng đợi bằng DSLK
Trang 19Khởi tạo hàng đợi
Kiểm tra hàng đợi có rỗng
không
void QueueInitialize(Queue
&q){q.head=NULL;
q.tail=NULL;
}
int QueueEmpty(Queue q){
return (q.head==NULL);
}
11.3 Cài đặt hàng đợi bằng DSLK
Trang 20Lecture 11 – Hàng đợi (Queues)
11.1 Khái niệm về hàng đợi
11.2 Cài đặt hàng đợi bằng mảng
11.2.1 Các thao tác cơ bản
11.2.2 Các thao tác bổ trợ
11.3 Cài đặt hàng đợi bằng con trỏ (Linked list)
11.4 Vài ứng dụng của hàng đợi
11.4.1 Palindromes
11.4.2 Demerging
11.4.3 Tính giá trị của biểu thức
11.4 Bài tập thực hành
Trang 22Lecture 11 – Hàng đợi (Queues)
11.1 Khái niệm về hàng đợi
11.2 Cài đặt hàng đợi bằng mảng
11.2.1 Các thao tác cơ bản
11.2.2 Các thao tác bổ trợ
11.3 Cài đặt hàng đợi bằng con trỏ (Linked list)
11.4 Vài ứng dụng của hàng đợi
11.4.1 Palindromes
11.4.2 Demerging
11.4.3 Tính giá trị của biểu thức
11.4 Bài tập thực hành
Trang 2311.4.2 Demerging
Tổ chức dữ liệu hợp lý - Demerging
Bài toán : Xem xét bài toán sau:
Giả sử, với một hệ thống quản lý nhân sự Các bản ghi được lưu trên file
Mỗi bản ghi gồm các trường: Họ tên, giới tính, ngày tháng năm sinh,
Dữ liệu trên đã được sắp theo ngày tháng năm sinh
Cần tổ chức lại dữ liệu sao cho nữ được liệt kê trước nam nhưng vẫn giữ được tính đã sắp theo ngày tháng năm sinh
Trang 24Ý tưởng hiệu quả hơn:
Sử dụng giải thuật demerging.
Độ phức tạp của giải thuật này là O(n)
Trang 2511.4.2 Demerging
Giải thuật Demerging:
Trang 26Lecture 11 – Hàng đợi (Queues)
11.1 Khái niệm về hàng đợi
11.2 Cài đặt hàng đợi bằng mảng
11.2.1 Các thao tác cơ bản
11.2.2 Các thao tác bổ trợ
11.3 Cài đặt hàng đợi bằng con trỏ (Linked list)
11.4 Vài ứng dụng của hàng đợi
11.4.1 Palindromes
11.4.2 Demerging
11.4.3 Tính giá trị của biểu thức
11.4 Bài tập thực hành
Trang 2711.4.3 Tính giá trị của biểu thức
VD Tính giá trị của biểu thức sau:
Trang 28Lecture 11 – Hàng đợi (Queues)
11.1 Khái niệm về hàng đợi
11.2 Cài đặt hàng đợi bằng mảng
11.2.1 Các thao tác cơ bản
11.2.2 Các thao tác bổ trợ
11.3 Cài đặt hàng đợi bằng con trỏ (Linked list)
11.4 Vài ứng dụng của hàng đợi
11.4.1 Palindromes
11.4.2 Demerging
11.4.3 Tính giá trị của biểu thức
11.4 Bài tập thực hành