1.在h文件中定义顺序栈的数据结构体
typedef struct data
{
char plate[10];//车牌号
int t_year;
int t_mon;
int t_day;
int t_hour;
int t_min;
int t_sec;//保存时间
time_t start_sec;//保存入库时间,从1970年到现在的秒数
}Data;
将顺序栈的元素定义成数据和指针组合成的结构体
typedef struct stack
{
Data data[SIZE]; // 栈存储空间
int top; // 栈顶元素的下标
}Stack;
2、在h文件中定义链式队列的数据结构体
typedef struct node
{
char num[10]; // 存放车牌号
struct node *next; // 指向下一个元素的指针
}Node;
定义队头和队尾组成的结构体
typedef struct queue
{
Node *front;//队头
Node *rear;//队尾
}Queue;
2.在c文件中写出顺序栈的初始化函数Init1,判断空栈函数Empty1,判断满栈函数Full1,入栈函数Push1,出栈函数Pop1,获得栈顶元素函数GetTop1.
再写出链式栈的初始化队列函数Init2,判断空队列函数Empty2,入队列函数Push2,出队列函数Pop2,获取队列顶元素函数GetTop2.
3.在h文件中写出顺序栈和链式队列的函数声明
4.先初始化车库栈,让路栈,等候队列
5.打印出需要的功能选择,用fgets来获取命令,由于我上面用了system函数来清屏,下面调用getchar函数,防止清屏太快,看不到结果。
6.用switch对应用户操作的命令:停车,离开,查看停车场停车状况
停车:先判断车库有没有满,满了就调用等候队列的入队列函数
if(Full1(s)==TRUE)
{
char num[10];
printf("请输入车牌号\n");
scanf("%s",num);
getchar();
Push2(q,num);//车库满了,进等待队列
printf("%s\n",GetTop2(q));
/* while(q->front!=NULL)//之前为了测试错误,写的
{
printf("%s\n",q->front->num);//不能这么用,由于传的是指针
q->front=q->front->next;//所以会把链表队头一直往后指,甚至会出现断错误
} */
int count=len(*q)-1;
printf("车库已满,您的车在等候区等候,您的前面有%d人\n",count);
}
如果没有满,就进入车库,调用入栈函数
Data data;
printf("请输入车牌号\n");
scanf("%s",data.plate);
getchar();
time_t t;
struct tm * lt;
// 获取Unix时间戳
time (&t);
data.start_sec=t;
// 转为时间结构
lt = localtime (&t);
// 输出结果
//printf ( "%d/%d/%d %d:%d:%d\n",lt->tm_year+1900, lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);
data.t_year = lt->tm_year+1900;
data.t_mon = lt->tm_mon + 1;
data.t_day = lt->tm_mday;
data.t_hour = lt->tm_hour;
data.t_min = lt->tm_min;
data.t_sec = lt->tm_sec;
Push1(s , data);
system("clear");
printf("停车成功!\n");
离开:想要离开,必须将车子后面的车先移走,才能离开,所以在离开前,要将后面的移入让路栈
while(num < (s1->top)+1)
{
data=GetTop1(s1);
Push1(s2,data);
Pop1(s1);
//printf("3\n");
}
然后让车出栈再将后面的车移回车库,此时,要判断等候区是否有车子,如果有车,需将等候区的第一辆车移入车库。
if(num == (s1->top)+1)
{
data = GetTop1(s1);
time_t t;
//struct tm * lt;
// 获取Unix时间戳
time (&t);
time_t all_t = t - data.start_sec;
//double cost = difftime(t, data.start_sec);
printf("车位号:%d\t",s1->top+1);
printf("车牌号: %s\t",s1->data[s1->top].plate);
printf("停车时长:%ld s\t",all_t);
printf ("入库时间:%d/%d/%d %d:%d:%d\n",s1->data[s1->top].t_year, s1->data[s1->top].t_mon,s1->data[s1->top].t_day, s1->data[s1->top].t_hour, s1->data[s1->top].t_min, s1->data[s1->top].t_sec);
Pop1(s1);
printf("您已成功出库,欢迎下次光临!\n");
while(Empty1(s2) == FALSE)//把让路栈的车返回到车库
{
data = GetTop1(s2);
Push1(s1,data);
Pop1(s2);
}
if(Empty2(q) == FALSE)//等候区有车,就把第一辆车移到车库
{//char num[10]=GetTop2(q);
printf("%s\n",GetTop2(q));
strcpy(data.plate,GetTop2(q));//获取等候区第一辆车
time_t t2;
struct tm * lt;
// 获取Unix时间戳
time (&t2);
data.start_sec = t2;
// 转为时间结构
lt = localtime (&t2);
//strcpy(data.plate,num);
data.t_year = lt->tm_year+1900;
data.t_mon = lt->tm_mon + 1;
data.t_day = lt->tm_mday;
data.t_hour = lt->tm_hour;
data.t_min = lt->tm_min;
data.t_sec = lt->tm_sec;
Push1(s1 , data);//将等候区第一辆车压栈进入车库
printf("车牌号%s停车成功!\n",GetTop2(q));
Pop2(q);//将第一辆车移出等候队列
查看停车场停车状况:将车库栈中保存的data结构体打印出来
void Display(Stack *s,Queue *q)
{
time_t t;
int i=s->top;
while(i!=-1)
{
time (&t);
time_t all_t = t - s->data[i].start_sec;
printf("车位: %d\t",i+1);
printf("车牌号:%s\t",s->data[i].plate);
printf ("入库时间:%d/%d/%d %d:%d:%d\t",s->data[i].t_year, s->data[i].t_mon,s->data[i].t_day, s->data[i].t_hour, s->data[i].t_min, s->data[i].t_sec);
printf("停车时长:%ld s\n",all_t);
i--;
}
int count;
}