Bài 14 Danh sách tuyến tính kiểu hàng đợi

28 858 2
Bài 14 Danh sách tuyến tính kiểu hàng đợi

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

BÀI 14: DANH SÁCH TUYẾN TÍNH KIỂU HÀNG ĐỢI (QUEUE) 14.1 ĐỊNH NGHĨA Hàng đợi vật chứa (container) đối tượng làm việc theo chế FIFO (First In First Out) nghĩa việc thêm đối tượng vào hàng đợi lấy đối tượng khỏi hàng đợi thực theo chế "Vào trước trước" Các đối tượng thêm vào hàng đợi lúc có đối tượng thêm vào phép lấy khỏi hàng đợi Thao tác thêm đối tượng vào hàng đợi lấy đối tượng khỏi hàng đợi gọi "enqueue" "dequeue" Việc thêm đối tượng vào hàng đợi diễn cuối hàng đợi phần tử lấy từ đầu hàng đợi Ta hình dung nguyên tắc hoạt động Queue sau: sn s2 Queue s1 Trong tin học, CTDL hàng đợi có nhiều ứng dụng: khử đệ qui, tổ chức lưu vết trình tìm kiếm theo chiều rộng quay lui, vét cạn, tổ chức quản lý phân phối tiến trình hệ điều hành, tổ chức đệm bàn phím, Ta định nghĩa CTDL hàng đợi sau: hàng đợi CTDL trừu tượng (ADT) tuyến tính Tương tự stack, hàng đợi hỗ trợ thao tác: EnQueue(o): Thêm đối tượng o vào cuối hàng đợi DeQueue(): Lấy đối tượng đầu queue khỏi hàng đợi trả giá trị Nếu hàng đợi rỗng lỗi xảy IsEmpty(): Kiểm tra xem hàng đợi có rỗng khơng Front(): Trả giá trị phần tử nằm đầu hàng đợi mà khơng hủy Nếu hàng đợi rỗng lỗi xảy Các thao tác thêm, trích huỷ phần tử phải thực phía khác hàng đợi hoạt động hàng đợi thực theo nguyên tắc FIFO (First In First Out - vào trước trước) Cũng stack, ta dùng cấu trúc mảng chiều cấu trúc danh sách liên kết để biểu diễn cấu trúc hàng đợi 14.2 CÀI ĐẶT QUEUE 14.2.1 Cài đặt Queue mảng Ta tạo hàng đợi cách sử dụng mảng chiều với kích thước tối đa N (ví dụ, N 1000) theo kiểu xoay vịng (coi phần tử an-1 kề với phần tử a0) Như hàng đợi chứa tối đa N phần tử Phần tử nằm đầu hàng đợi (front element) có số f Phần tử nằm cuối hàng đợi (rear element) có số r (xem hình) Ðể khai báo hàng đợi, ta cần mảng chiều Q, hai biến nguyên f, r cho biết số đầu cuối hàng đợi số N cho biết kích thước tối đa hàng đợi Ngoài ra, dùng mảng biểu diễn hàng đợi, ta cần giá trị đặc biệt để gán cho cịn trống hàng đợi Giá trị giá trị nằm miền xác định liệu lưu hàng đợi Ta ký hiệu nullDATA phần trước Trạng thái hàng đợi lúc bình thường: Trạng thái hàng đợi lúc xoay vòng: Hoặc: Null A F B C D E R Khi queue rỗng R = F = Nếu phần tử queue lưu trữ từ máy bổ sung phần tử vào queue R tăng lên 1, loại bỏ phần tử khỏi queue F tăng lên Câu hỏi đặt ra: giá trị f=r cho ta điều ? Ta thấy rằng, lúc hàng đợi hai trạng thái rỗng đầy Coi tập bạn tự suy nghĩ tìm câu trả lời trước đọc tiếp để kiểm tra kết Hàng đợi khai báo cụ thể sau: Data Q[N] ; int f, r; int count ; // Đếm số lượng phần tử có hàng đợi Cũng strack, cài đặt mảng chiều, hàng đợi có ki?hước tối đa nên ta cần xây dựng thêm thao tác phụ cho hàng đợi: IsFull(): isEmpty(): Kiểm tra xem hàng đợi có đầy chưa Kiểm tra hàng đợi rỗng bool IsFull() //Kiểm tra xem hàng đợi có đầy chưa { return (count == N); } // Kiểm tra Queue rỗng count =0; bool isEmpty() { return count == 0; } void EnQueue(Data X) // Thêm phần tử vào hàng đợi { if (IsFull() == false) { if (f == -1) // Hàng đợi rỗng f =0; if (r == N-1) r = 0; else r ++; Q[r] = X; count ++; // Tăng số lượng phần tử có hàng đợi nên } } Data DeQueue() // Lấy phần tử khỏi Queue { if (isEmpty() == true) // Queue rỗng sinh ngoại lệ throw new Exception(“Hàng đợi rỗng”); else { Data x = Q[f]; if(f == N-1) f =0; else f ++; count ; // Giảm số lượng phần tử có queue đơn vị return x; } } 14.2.2 Cài đặt Queue danh sách Ta tạo hàng đợi cách sử dụng DSLK đơn Phần tử đầu DSKL (head) phần tử đầu hàng đợi, phần tử cuối DSKL (tail) phần tử cuối hàng đợi Sau thao tác tương ứng cho list-queue: • Tạo hàng đợi rỗng: Lệnh Q.pHead = Q.pTail = null tạo hàng đợi rỗng • Kiểm tra hàng đợi rỗng : int IsEmpty(LIST Q) { if (Q.pHead == null) // stack rỗng return 1; else return 0; } • Thêm phần tử p vào cuối hàng đợi void EnQueue(LIST Q, Data x) { InsertTail(ref Q, x); } • Loại bỏ phần tử đầu hàng đợi Data DeQueue(LIST Q) { Data x; if (IsEmpty(Q)==1) throw new Exception(“Hàng đợi rỗng”); x = RemoveFirst(ref Q); return x; } • Xem thông tin phần tử đầu hàng đợi Data Front(LIST Q) { if (IsEmpty(Q)==1) throw new Exception(“Hàng đợi rỗng”); return Q.pHead.Info; } Các thao tác làm việc với chi phí O(1) Chương trình minh họa hàng đợi có ưu tiên, cách cài đặt nút hàng đợi có độ ưu tiên giảm dần từ front tới rear pqinsert: Chèn nút vào vị trí thích hợp hàng đợi để đảm bảo độ ưu tiên nút giảm dần từ front tới rear pqremove: Xóa nút có độ ưu tiên cao nhất, nút nút front using System; namespace HangDoiUuTien { class pqueue { public static int MaxQueue = 100; public int rear; // front luon la public int[] Nodes = new int[MaxQueue]; // moi nut la mot so nguyen chi uu tien } class Program { // Tac vu pqinitialize: khoi dong hang doi co uu tien static void pqinitialize(pqueue ppq) { ppq.rear = -1; } // Tac vu pqempty: kiem tra hang doi co rong khong static bool pqempty(pqueue ppq) { return ((ppq.rear == -1) ? true : false ); } // Tac vu pqueuesize: xac dinh so nut co hang doi static int pqueuesize(pqueue ppq) { return (ppq.rear + 1); } // Tac vu pqinsert: them nut vao hang doi co uu tien static void pqinsert(ref pqueue ppq, int x) { int i, j; if (ppq.rear == pqueue.MaxQueue - 1) Console.WriteLine("Hang doi bi day, khong them nut duoc"); else { // tim vi tri chen for (i = 0; i < pqueuesize(ppq) && ppq.Nodes[i] >= x; i++) ; // doi cho cac nut tu nut cuoi den nut i+1 len mot vi tri for (j = pqueuesize(ppq); j > i; j ) ppq.Nodes[j] = ppq.Nodes[j - 1]; ppq.Nodes[i] = x; ppq.rear++; } } /* Tac vu pqremove: xoa nut co uu tien cao nhat (nut o front), truong hop ta phai doi cac nut tu nut thu hai den nut cuoi xuong mot vi tri */ static int pqremove(ref pqueue ppq) { int x, i; if (pqempty(ppq)) { Console.WriteLine("Hang doi bi rong, khong xoa nut duoc"); throw new Exception("Hàng đợi rỗng"); } else { x = ppq.Nodes[0]; // uu tien cua nut can xoa // doi cho for (i = 0; i < ppq.rear; i++) ppq.Nodes[i] = ppq.Nodes[i + 1]; ppq.rear ; return x; } } // Tac vu pqtraverse: duyet hang doi co uu tien tu front den rear static void pqtraverse(pqueue ppq) { int i; if (pqempty(ppq)) Console.WriteLine("hang doi bi rong"); else for (i = 0; i

Ngày đăng: 03/10/2013, 07:20

Hình ảnh liên quan

Ta hình dung nguyên tắc hoạt động của Queue như sau: - Bài 14 Danh sách tuyến tính kiểu hàng đợi

a.

hình dung nguyên tắc hoạt động của Queue như sau: Xem tại trang 1 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan