ỨNG DỤNG CỦA QUEUE

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

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ý, ..

Một số ví dụ:

Chương trình quản lý kho. Mặt hàng nào nhập kho trước sẽ được xuất kho trước. // Chuong trinh viet bang con tro

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace quanLyKho { class mathang

{

public int mamh; public string tenmh; public mathang next; }

class queue {

public mathang pHead; public mathang pTail;

static void initialize( queue pq) {

pq.pHead = pq.pTail=null;

}

static bool empty( queue pq) {

return((pq.pHead==null) ? true : false); }

static void insert(ref queue pq, mathang x) { if (pq.pHead == null) pq.pHead = pq.pTail = x; else { pq.pTail.next = x; pq.pTail = x; } }

static mathang remove(ref queue pq) {

if(empty(pq))

throw new Exception("kho khong con hang"); else

{

mathang mh = pq.pHead; pq.pHead = pq.pHead.next;

return mh; }

}

// Tac vu traverse: duyet kho hang tu front toi rear static void traverse( queue pq)

{

if(empty(pq)) {

Console.WriteLine("\nKho khong con hang"); return;

}

// vong lap in cac nut tu pHead den pTail queue tmp = pq;

while(!(empty(tmp))) {

Console.WriteLine(" "+ tmp.pHead.mamh+ " "+ tmp.pHead.tenmh ); tmp.pHead = tmp.pHead.next;

} }

// chuong trinh chinh

public static void Main(string [] args) {

queue q = new queue(); // Tạo một hàng đợi int chucnang, front1;

mathang mh = new mathang(); // khoi tao queue

initialize(q); do {

Console.WriteLine("\n\n\t\t\tCHUONG TRINH QUAN LY KHO"); Console.WriteLine("\n\t\t\t(NHAP TRUOC - XUAT TRUOC)"); Console.WriteLine("\n\nCac chuc nang cua chuong trinh:\n"); Console.WriteLine(" 1: Nhap mot mat hang\n");

Console.WriteLine(" 2: Xuat mot mat hang\n");

Console.WriteLine(" 3: Xem mat hang chuan bi xuat\n"); Console.WriteLine(" 4: Xem mat hang moi nhap\n"); Console.WriteLine(" 5: Xem cac mat hang co trong kho\n");

Console.WriteLine(" 6: Xuat toan bo kho hang\n"); Console.WriteLine(" 0: Ket thuc chuong trinh\n");

Console.WriteLine("Chuc nang ban chon: "); chucnang = int.Parse(Console.ReadLine()); switch(chucnang) { case 1:{ mh = new mathang();

Console.WriteLine("\nMa mat hang: "); mh.mamh = int.Parse(Console.ReadLine()); Console.WriteLine("Ten mat hang: "); mh.tenmh = Console.ReadLine(); mh.next = null; insert(ref q, mh); break; } case 2:{ if(!empty(q)) { mh = remove(ref q);

Console.WriteLine("\nMat hang xuat: Ma:"+ mh.mamh+ "Ten: "+ mh.tenmh); }

else

Console.WriteLine("\nKho khong con hang"); break;

} case 3:{ if (empty(q))

Console.WriteLine("Khong co hang trong kho"); else

Console.WriteLine("\nMat hang chuan bi xuat: Ma:"+ q.pHead.mamh + " Ten:" + q.pHead.tenmh);

break; } case 4:{

Console.WriteLine("\nMat hang moi nhap: Ma:"+ q.pTail.mamh + " Ten:"+ q.pTail.tenmh); break;

} case 5:{

Console.WriteLine("\nCac mat hang co trong kho:");

traverse(q); break; }

case 6: // xoa toan bo queue (khoi dong queue) {

Console.WriteLine("\nBan co chac khong (c/k): "); string ch = Console.ReadLine(); if(ch == "C" || ch == "c") initialize(q); break; } } } while(chucnang != 0); } } }

Hãy cài đặt chương trình quản lý kho hàng ở trên bằng mảng.

11.4. Hàng đợi hai đầu (double-ended queue)

Hàng đợi hai đầu (gọi tắt là Deque) là một vật chứa các đối tượng mà việc thêm hoặc hủy một đối tượng được thực hiện ở cả 2 đầu của nó.

Ta có thể định nghĩa CTDL deque như sau: deque là một CTDL trừu tượng (ADT) hỗ trợ các thao tác chính sau:

InsertFirst(e): Thêm đối tượng e vào đầu deque InsertLast(e): Thêm đối tượng e vào cuối deque

RemoveFirst():Lấy đối tượng ở đầu deque ra khỏi deque và trả về giá trị của nó. RemoveLast():Lấy đối tượng ở cuối deque ra khỏi deque và trả về giá trị của nó. Ngoài ra, deque cũng hỗ trợ các thao tác sau:

IsEmpty(): Kiểm tra xem deque có rỗng không.

First(): Trả về giá trị của phần tử nằm ở đầu deque mà không hủy nó. Last(): Trả về giá trị của phần tử nằm ở cuối deque mà không hủy nó.

Dùng deque để cài đặt stack và queue

Ta có thể dùng deque để biểu diễn stack. Khi đó ta có các thao tác tương ứng như sau:

STT Stack Deque

1 Push InsertLast

2 Pop RemoveLast

3 Top Last

Tương tự, ta có thể dùng deque để biểu diễn queue. Khi đó ta có các thao tác tương ứng như sau:

STT Queue Deque 1 Enqueue InsertLast 2 Dequeue RemoveFist 3 Front First 4 IsEmpty IsEmpty • Cài đặt deque

Do đặc tính truy xuất hai đầu của deque, việc xây dựng CTDL biểu diễn nó phải phù hợp. Ta có thể cài đặt CTDL deque bằng danh sách liên kết đơn. Tuy nhiên, khi đó thao tác RemoveLast hủy phần tử ở cuối deque sẽ tốn chi phí O(n). Ðiều này làm giảm hiệu quả của CTDL. Thích hợp nhất để cài đặt deque là dùng danh sách liên kết kép. Tất cả các thao tác trên deque khi đó sẽ chỉ tốn chi phí O(1)

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

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

(100 trang)
w