Các phép toán cơ bản trên hàng

Một phần của tài liệu Bài giảng cấu trúc dữ liệu - Chương 2 Cấu trúc dữ liệu danh sách pdf (Trang 64 - 80)

- Tốn vùng nhớ cho chỉ điểm liên kết Không thích hợp cho tìm kiếm

b. Các phép toán cơ bản trên hàng

4. Hàng đợi

Các khai báo cần thiết

#define MaxLength ... //chiều dài tối đa của mảng typedef ... ElementType;

//Kiểu dữ liệu của các phần tử trong hàng typedef struct {

ElementType Elements[MaxLength]; //Lưu trữ nội dung các phần tử

int Front, Rear; //chỉ số đầu và đuôi hàng } Queue;

4. Hàng đợi Tạo hàng void Make_Queue(Queue *Q) { Q->Front=-1; Q->Rear=-1; } c. Tổ chức theo danh sách đặc

4. Hàng đợi Kiểm tra hàng rỗng int Empty_Queue(Queue Q) { return Q.Front==-1; } c. Tổ chức theo danh sách đặc

4. Hàng đợi

Kiểm tra đầy

Hàng đầy nếu số phần tử hiện có trong hàng bằng số phần tử trong mảng. int Full_Queue(Queue Q) { return (Q.Rear-Q.Front+1)==MaxLength; } c. Tổ chức theo danh sách đặc

4. Hàng đợi

Xóa phần tử ra khỏi hàng

Khi xóa một phần tử đầu hàng ta chỉ cần cho front tăng lên 1. Nếu front > rear thì hàng thực chất là hàng đã rỗng, nên ta sẽ khởi tạo lại hàng rỗng (tức là đặt lại giá trị front = rear =-1).

4. Hàng đợi

Xóa phần tử ra khỏi hàng

void O_Queue(Queue *Q,int *x){ if (!Empty_Queue(*Q)) { *x=Q->Elements[Q->Front]; Q->Front=Q->Front+1; if (Q->Front>Q->Rear) Make_Queue(Q); }

else cout<<"Loi: Hang rong!"; }

4. Hàng đợi

Thêm phần tử vào hàng

void I_Queue(int X,Queue *Q) { if (!Full_Queue(*Q)) { if (Empty_Queue(*Q)) Q->Front=0; if (Q->Rear==MaxLength-1) { for(int i=Q->Front;i<=Q->Rear;i++) Q->Elements[i-Q->Front]=Q->Elements[i];

Q->Rear=MaxLength - Q->Front-1; Q->Front=0; }

Q->Rear=Q->Rear+1; Q->Elements[Q->Rear]=X; } else cout<<"Loi: Hang day!";

}

4. Hàng đợi

Khai báo cần thiết

typedef ... ElementType; //kiểu phần tử của hàng typedef struct Node{

ElementType Element;

Node* Next; //Con trỏ chỉ ô kế tiếp };

typedef Node* Position; typedef struct{

Position Front, Rear;

//là hai trường chỉ đến đầu và cuối của hàng } Queue;

4. Hàng đợi

Khởi tạo hàng rỗng

Khi hàng rỗng Front va Rear cùng trỏ đến NULL void Make_Queue(Queue *Q)

{

Q->Front= Q->Rear=NULL; }

4. Hàng đợi

Kiểm tra hàng rỗng

Hàng rỗng nếu Front trỏ đến NULL int Empty_Queue(Queue Q)

{

return (Q.Front==NULL); }

4. Hàng đợi

Thêm một phần tử vào hàng void I_Queue(int X, Queue *Q) {Node *p; if(Q->Rear==NULL) { p=(Node*)malloc(sizeof(Node)); p->Element=X;p->Next=NULL; Q->Front=Q->Rear=p; }else {p=(Node*)malloc(sizeof(Node)); p->Element=X;p->Next=NULL; Q->Rear->Next=p; Q->Rear=p; } }

4. Hàng đợi

Xóa một phần tử ra khỏi hàng void O_Queue(Queue *Q,int *x) { if (!Empty_Queue(*Q)) { *x=Q->Front->Element; Position T; T=Q->Front; Q->Front=Q->Front->Next; free(T); }

else cout<<"Loi : Hang rong"; }

4. Hàng đợi

Hàng đợi là một cấu trúc dữ liệu được dùng khá phổ biến trong thiết kế giải thuật. Bất kỳ nơi nào ta cần quản lí dữ liệu, quá trình... theo kiểu vào trước-ra trước đều có thể ứng dụng hàng đợi.

Ví dụ rất dễ thấy là quản lí in trên mạng, nhiều máy tính yêu cầu in đồng thời và ngay cả một máy tính cũng yêu cầu in nhiều lần. Nói chung có nhiều yêu cầu in dữ liệu, nhưng máy in không thể đáp ứng tức thời tất cả các yêu cầu đó nên chương trình quản lí in sẽ thiết lập một hàng đợi để quản lí các yêu cầu. Yêu cầu nào mà chương trình quản lí in nhận trước nó sẽ giải quyết trước.

4. Hàng đợi

Một ví dụ khác là duyệt cây theo mức được trình bày chi tiết trong chương sau. Các giải thuật duyệt theo chiều rộng một đồ thị có hướng hoặc vô hướng cũng dùng hàng đợi để quản lí các nút đồ thị. Các giải thuật đổi biểu thức trung tố thành hậu tố, tiền tố.

Chúc các bạn thành công !

Bài tập Ngăn xếp & Hàng đợi

Một phần của tài liệu Bài giảng cấu trúc dữ liệu - Chương 2 Cấu trúc dữ liệu danh sách pdf (Trang 64 - 80)

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

(80 trang)