Trong những bài trước, ta đã làm quen và đã cài đặt một chương trình hoàn chỉnh cấu trúc hàng đợi bằng mảng. Để ôn luyện lại cách cài đặt queue bằng mảng, trong bài này tôi đưa ra một ví dụ để cùng các bạn tham khảo rõ hơn về cách cài đặt queue bằng mảng!

1.Yêu cầu đề bài quản lý hàng hóa bằng hàng đợi queue

Trên ngôn ngữ C/C++, viết chương trình thực hiện yêu cầu sau: Khai báo cấu trúc date gồm các thông tin: ngày, tháng, năm.

struct date
{
    int ngay, thang, nam;
};

Khai báo cấu trúc hàng hóa cần bốc xếp trên băng chuyền bao gồm các thông tin: Mã hàng hóa, tên hàng hóa, ngày xuất hàng, giá xuất hàng đi (đơn vị triệu đồng):

struct hang
{
    char ID[6];
    char ten[256];
    date ngay_xuat;
    float gia_xuat;
};

1.Viết các hàm nhập vào từ bàn phím giá trị của một biến cấu trúc hàng hóa, hiển thị lên màn hình.

2.Nhập vào 1 số nguyên dương n, sử dụng cấu trúc dữ liệu hàng đợi (queue) nhập vào băng chuyền gồm n hàng hóa cần bốc xếp.

3.Hiển thị lên màn hình thông tin tất cả các hàng hóa trong hàng đợi có mã hàng hóa (trường ID) là “001”.

4.Hiển thị lên màn hình thông tin hàng hóa đã bốc xếp (hiện tại băng chuyền đã rỗng).

2.Xứ lý yêu cầu đề bài bằng hàng đợi queue cài đặt bằng mảng

Trước khi đi vào thực hiện yêu cầu trên, bạn đọc hãy chắc chắn rằng đã hiểu về cách cài đặt hàng đợi bằng mảng và đồng thời phải có kiến thức về struct trong C/C++.

#include <stdio.h>
#include <string.h>
#define MAX 100
struct date{
    int ngay, thang, nam;
};
typedef struct date DATE;

struct hang{
    char ID[6];
    char ten[256];
    DATE ngay_xuat;
    float gia_xuat;
};
typedef struct hang HH;

struct queue{
    HH A[MAX];
    int front, rear;
};
typedef struct queue QUEUE;

void Init(QUEUE &q){
    q.front = 0;
    q.rear = -1;
}

int IsEmpty(QUEUE q){
    if (q.front > q.rear){
        return 1;
    }
    return 0;
}

int IsFull(QUEUE q){
    if (q.rear==MAX-1){
        return 1;
    }
    return 0;
}

void Add(QUEUE &q, HH x){
    if (IsFull(q)==0){
        q.rear++;
        q.A[q.rear] = x;
    }
}

HH Remove (QUEUE &q){
    HH x;
    if (!IsEmpty(q)) {
        x = q.A[q.front];
        q.front++;
        return x;
    }
    else{
        q.front = 0; 
        q.rear = -1;
    }
}

void Input(QUEUE &q, int n){
    for(int i = 0; i < n; i++){
        printf("NHAP THONG TIN HANG HOA THU %d \n", i);
        HH x;
        printf("NHAP ID: ");
        fflush(stdin);
        gets(x.ID);
        printf("NHAP TEN: ");
        fflush(stdin);
        gets(x.ten);
        printf("NHAP NGAY XUAT: ");
        printf("\nNGAY: ");
        scanf("%d",&x.ngay_xuat.ngay);
        printf("THANG: ");
        scanf("%d",&x.ngay_xuat.thang);
        printf("NAM: ");
        scanf("%d",&x.ngay_xuat.nam);
        printf("NHAP GIA XUAT: ");
        scanf("%f",&x.gia_xuat);
        printf("\n \n");
        Add(q, x);
    }
}   

void Output(QUEUE q){
    for(int i = q.front; i <= q.rear; i++){
        printf("%s\t %s\t %d/%d/%d\t %f\n",q.A[i].ID, q.A[i].ten, q.A[i].ngay_xuat.ngay, q.A[i].ngay_xuat.thang, q.A[i].ngay_xuat.nam, q.A[i].gia_xuat);
    }
}

void Ma001(QUEUE q){
    for(int i = q.front; i <= q.rear; i++){
        if(strcmp(q.A[i].ID, "001") == 0){
            printf("%s\t %s\t %d/%d/%d\t %f\n",q.A[i].ID, q.A[i].ten, q.A[i].ngay_xuat.ngay, q.A[i].ngay_xuat.thang, q.A[i].ngay_xuat.nam, q.A[i].gia_xuat);
        }
    }
}
void HangBocXep(QUEUE &q){
    for(int i = q.front; i <= q.rear; i++){
        HH x = Remove(q);
        printf("%s\t %s\t %d/%d/%d\t %f\n",x.ID, x.ten, x.ngay_xuat.ngay, x.ngay_xuat.thang, x.ngay_xuat.nam, x.gia_xuat);
    }
}
int main(){
    QUEUE q;
    int n;
    printf("NHAP SO LUONG HANG HOA: ");
    scanf("%d",&n);
    Init(q);
    Input(q, n);
    printf("DANH SACH HANG HOA \n");
    Output(q);
    printf("\nTHONG TIN HANG HOA CO MA 001\n");
    Ma001(q);
    printf("\nTHONG TIN HANG HOA DA BOC XEP\n");
    HangBocXep(q);
    printf("\nTHONG TIN HANG HOA SAU KHI BOC XEP (BANG TRUYEN RONG)\n");
    Output(q);
}