- 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