Hàng đợi và ứng dụng

Một phần của tài liệu Baigiang dung chung kythuatlaptrinh (Trang 48 - 53)

Định nghĩa và khai báo

Khác với stack, hàng đợi Queue là một danh sách tuyến tính mà thao tác bổ sung phần tử được thực hiện ở một đầu gọi là đầu vào và phép loại bỏ phần tử được thực hiện ở đầu khác gọi là lối ra. Như vậy cơ chế của Queue giống như một hàng đợi, vào ở một đầu và ra ở một đầu.

Ta có thể khai báo hàng đợi như một danh sách tuyến tính gồm MAX phần tử mỗi phần tử là một cấu trúc, hai biến front và rear trỏ lối vào và lối ra trong Queue. Ví dụ dưới đây định nghĩa một hàng đợi của các sản phẩm gồm hai thuộc tính mã hàng và tên hàng: typedef struct{ int mahang; char ten[20]; }hang; typedef struct{ int front,rear;

hang node[MAX]; }queue;

Để truy nhập vào hàng đợi chúng ta dùng hai biến con trỏ front và rear, front chỉ lối trước và rear chỉ lối sau. Khi lối trước trùng với lối sau, ta nói queue ở trạng thái rỗng.

Các thao tác với hàng đợi được thực hiện như trong hình vẽ dưới:

Hình 3.2. Hàng đợi

Với cách tổ chức này sẽ dẫn tới trường hợp các phần tử di chuyển khắp bộ nhớ khi được thêm hay loại bỏ. Trong một số trường hợp, khi thêm hoặc loại bỏ phần tử chúng ta xét tới thứ tự ưu tiên. Khi đó, chúng ta có hàng đợi ưu tiên.

Cài đặt minh họa hàng đợi bằng danh sách móc nối: #include <stdlib.h>

#include <stdio.h>

typedef int item; //kieu du lieu struct Node { item Data; Node * Next; }; struct Queue {

int count; //dem so phan tu };

void Init (Queue &Q); //khoi tao Queue rong int Isempty(Queue Q); //kiem tra Queue rong

void Push(Queue &Q, item x); //them phan tu vao cuoi hang doi int Pop(Queue &Q); //Loai bo phan tu khoi dau hang doi

int Qfront (Queue Q); //xem thong tin phan tu dau hang doi Node *MakeNode(item x); //tao 1 Node

void Input (Queue &Q); //Nhap void Output(Queue Q); //Xuat

void Init(Queue &Q) {

Q.Front = Q.Rear = NULL; Q.count = 0;

}

int Isempty (Queue Q) //kiem tra Queue rong {

if (Q.count == 0) //so phan tu = 0 => rong return 1;

return 0; }

Node *MakeNode(item x) //tao 1 Node {

Node *P = (Node*) malloc(sizeof(Node)); P->Next = NULL;

P->Data = x; return P; }

void Push(Queue &Q, item x) //them phan tu vao cuoi Queue {

Node *P = MakeNode(x); //Neu Q rong if (Isempty(Q))

{ (adsbygoogle = window.adsbygoogle || []).push({});

Q.Front = Q.Rear = P; //dau va cuoi deu tro den P }

else //Khong rong {

Q.Rear->Next = P; Q.Rear = P;

}

Q.count ++ ; //tang so phan tu len }

int Pop(Queue &Q) //Loai bo phan tu khoi dau hang doi {

if (Isempty(Q)) {

printf("Hang doi rong !"); return 0;

} else {

item x = Q.Front->Data;

if (Q.count == 1) //neu co 1 phan tu Init(Q);

else

Q.Front = Q.Front->Next; Q.count --;

return x; //tra ve phan tu lay ra }

}

void Input (Queue &Q) //nhap hang doi { int i=0; item x; do { i++;

printf ("Nhap phan tu thu %d : ",i); scanf("%d",&x);

if (x != 0) Push(Q,x);

} while(x != 0); //nhap 0 de ket thuc } void Output(Queue Q) { Node *P = Q.Front; while (P != NULL) { printf("%d ",P->Data); P = P->Next;

} printf("\n"); } int main() { Queue Q; Init(Q); Input(Q); Output(Q); int lua_chon;

printf("Moi ban chon phep toan voi DS LKD:"); printf("\n1: Kiem tra Queue rong");

printf("\n2: Them phan tu vao Queue"); printf("\n3: Xoa phan tu trong Queue"); printf("\n4: Xuat Queue");

printf("\n5: Thoat"); do { printf("\nBan chon: "); scanf("%d",&lua_chon); switch (lua_chon) { case 1: {

if (Isempty(Q)) printf("Queue rong !"); else printf ("Queue khong rong !"); break;

} case 2: {

item x;

printf ("Nhap phan tu can chen vao Queue: "); scanf("%d",&x); Push(Q,x); break; } case 3: { Pop(Q); break; }

case 4: { Output(Q); break; } case 5: break; } }while (lua_chon !=5); return 0; } Ứng dụng của hàng đợi

Trong thực tế, có nhiều bài toán ứng dụng kiểu dữ liệu hàng đợi: bài toán rút tiền gửi tiền; bài toán đặt vé tàu,xe, máy bay; bài toán lập lịch; Hàng đợi còn được ứng dụng nhiều trong hệ điều hành, chương trình dịch để giải quyết các bài toán điều khiển chương trình, lập lịch thực thi các chương trình. (adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu Baigiang dung chung kythuatlaptrinh (Trang 48 - 53)