Cài đặt Queue bằng danh sách

Một phần của tài liệu MẢNG VÀ DANH SÁCH (Trang 43 - 47)

Ta có thể tạo một hàng đợi bằng cách sử dụng một DSLK đơn.

Phần tử đầu DSKL (head) sẽ là phần tử đầu hàng đợi, phần tử cuối DSKL (tail) sẽ là phần tử cuối hàng đợi.

Sau đây là các thao tác tương ứng cho list-queue:

• Tạo hàng đợi rỗng:

Lệnh Q.pHead = Q.pTail = null sẽ tạo ra một 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 một 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 của 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 trên đều 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 các nút trên hàng đợi có độ ưu tiên giảm dần từ front tới rear.

pqinsert: Chèn nút mới vào vị trí thích hợp trên hàng đợi để đảm bảo độ ưu tiên của các 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ày là nút tại front using System;

namespace HangDoiUuTien {

class pqueue {

public int rear; // front luon la 0

public int[] Nodes = new int[MaxQueue]; // moi nut la mot so nguyen chi do 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 trong 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 do uu tien cao nhat (nut o front), truong hop nay 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]; // do 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 <= ppq.rear; i++)

Console.WriteLine(ppq.Nodes[i]); }

public static void Main(string[] args) {

pqueue pq = new pqueue(); int douutien, chucnang; // khoi dong hang doi pqinitialize(pq); do

{

// menu chinh cua chuong trinh

Console.WriteLine("\n\n\t\tCHUONG TRINH MINH HOA HANG DOI CO UU TIEN\n"); Console.WriteLine("\nCac chuc nang cua chuong trinh:\n");

Console.WriteLine(" 1: Them nut vao hang doi co uu tien\n"); Console.WriteLine(" 2: Xoa nut co do uu tien cao nhat\n"); Console.WriteLine(" 3: Xoa toan bo hang doi\n"); Console.WriteLine(" 4: Duyet hang doi\n"); Console.WriteLine(" 0: Ket thuc chuong trinh\n"); Console.WriteLine("Chuc nang ban chon: "); chucnang = int.Parse(Console.ReadLine()); switch (chucnang)

{

case 1: {

Console.WriteLine("\nDo uu tien cua nut moi: "); douutien = int.Parse(Console.ReadLine()); pqinsert(ref pq, douutien);

break; }

case 2: { pqremove(ref pq); break; } case 3: {

Console.WriteLine("\nBan co chac khong (c/k): "); string ch = Console.ReadLine(); if (ch == "c" || ch == "C") pqinitialize(pq); break; } case 4: {

Console.WriteLine("\nDuyet hang doi: "); pqtraverse(pq); break; } } } while (chucnang != 0); } } }

Lưu ý, nếu không quản lý phần tử cuối xâu, thao tác dequeue sẽ có độ phức tạp O(n).

Một phần của tài liệu MẢNG VÀ DANH SÁCH (Trang 43 - 47)

Tải bản đầy đủ (DOCX)

(100 trang)
w