Trong bài này tôi cùng bạn sẽ ôn tập lại việc cài đặt stack bằng mảng trong C/C++. Trước khi vào bài, nếu bạn đọc chưa thực sự đọc bài “Cài đặt stack bằng mảng C/C++” vui lòng quay lại đọc (hiểu) bài trước rồi sau đó quay lại đọc đến bài tập này!

1.Yêu cầu đề bài quản lý máy tính bằng stack

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 máy tính bao gồm các thông tin: Mã máy, tên máy, ngày xuất hàng, giá xuất hàng đi (đơn vị triệu đồng):

struct Maytinh
{
    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 máy tính, 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 ngăn xếp (stack) nhập vào n máy tính thông qua hàm Push của stack

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

4.Hiển thị tất cả thông tin của các máy tính thông qua hàm Pop của stack, sau đó hiển thị lại stack đó (lúc này stack đã rỗng)

2.Xử lý yêu cầu đề bài bằng stack cài đặt bằng mảng

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

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

struct stack{
    int top;
    MT A[MAX];
};
typedef struct stack STACK;

void Init (STACK &s){
    s.top=-1;
}

int Empty (STACK s){
    if (s.top == -1){
        return 1;
    }
    return 0;
}

int IsFull (STACK s){
    if (s.top==MAX-1){
        return 1;
    }
    return 0;
}

void Push(STACK &s,MT x){
    if(IsFull(s)==0){ 
        s.top++;
        s.A[s.top]=x;
    }
}

MT Pop(STACK &s){
    MT x;
    if(!Empty(s)){
        x = s.A[s.top];
        s.top--;
    }
    return x;
}

void Input(STACK &s, int n){
    for(int i = 0; i< n; i++){
        MT 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: ");
        scanf("%f",&x.gia_xuat);
        printf("\n \n");
        Push(s,x);
    }
}
void Output(STACK s){
    for(int i = s.top; i > -1; i--){
        printf("%s\t %s\t %d/%d/%d\t %f\n",s.A[i].ID, s.A[i].ten, s.A[i].ngay_xuat.ngay, s.A[i].ngay_xuat.thang, s.A[i].ngay_xuat.nam, s.A[i].gia_xuat);
    }
}

void KiemTraMa(STACK s){
    for(int i = s.top; i > -1; i--){
        if(strcmp(s.A[i].ID, "007") == 0){
            printf("%s\t %s\t %d/%d/%d\t %f\n",s.A[i].ID, s.A[i].ten, s.A[i].ngay_xuat.ngay, s.A[i].ngay_xuat.thang, s.A[i].ngay_xuat.nam, s.A[i].gia_xuat);
        }
    }
}
void HienThiThongTin(STACK &s){
    for(int i = s.top; i > -1; i--){
        MT x = Pop(s);
        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(){
    STACK s;
    int n;
    printf("NHAP SO LUONG MAY TINH VAO STACK: ");
    scanf("%d",&n);
    Init(s);
    Input(s,n);
    printf("MAY TINH VUA NHAP VAO STACK LA: \n");
    Output(s);
    printf("DANH SACH MAY TINH CO MA 007\n");
    KiemTraMa(s);
    printf("SU DUNG HAM POP CAC PHAN TU TRONG STACK\n");
    HienThiThongTin(s);
    printf("THONG TIN MAY TINH CON LAI TRONG STACK\n");
    Output(s);
}