Stack.h
#ifndef _STACK_H_
#define _STACK_H_
#define SIZE 10
typedef enum {FALSE, TRUE} BOOL;
//顺序栈---------------------------------------
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;
}Data;
typedef struct stack
{
Data data[SIZE]; // 栈存储空间
int top; // 栈顶元素的下标
}Stack;
// 初始化栈
void Init1(Stack *s);
//判断空栈
BOOL Empty1(Stack *s);
//判断满栈
BOOL Full1(Stack *s);
//入栈
void Push1(Stack *s,Data data);
//出栈
void Pop1(Stack *s);
//获取栈顶元素
Data GetTop1(Stack *s);
//---------------------------------------------------
//链式队列
typedef struct node
{
char num[10]; // 队列存储空间
struct node *next; //
}Node;
typedef struct queue
{
Node *front;
Node *rear;
}Queue;
// 初始化队列
void Init2(Queue *q);
//判断空队列
BOOL Empty2(Queue *q);
//入队列
void Push2(Queue *q,char num[]);
//出队列
void Pop2(Queue *q);
//
char* GetTop2(Queue *q);
#endif
main.c
#include <stdio.h>
#include <string.h>
#include <string.h>
#include <time.h>
#include "Stack.h"
enum menu{PARK = '1', EXIT, DISPLAY, QUIT };
int len(Queue q)
{
int count=0;
while(q.front!=NULL)
{
count++;
q.front=q.front->next;
}
return count;
}
/* int len(Queue *q)错误!!!通过指针间接访问->修改了front指向,一直指到了末尾,gettop()时,获得了最后一个元素,前面的都没了
{
int count=0;如果这样传,需要重新定义一个Node *tmp来操作
while(q->front->next!=NULL)
{
count++;
q->front=q->front->next;
}
return count;
} */
void park(Stack *s,Queue *q)
{
if(Full1(s)==TRUE)
{
char num[10];
printf("请输入车牌号\n");
scanf("%s",num);
getchar();
Push2(q,num);//车库满了,进等待队列
printf("%s\n",GetTop2(q));
printf("88\n");
/* while(q->front!=NULL)
{
printf("%s\n",q->front->num);
q->front=q->front->next;
} */
int count=len(*q)-1;
printf("车库已满,您的车在等候区等候,您的前面有%d人\n",count);
}
else
{
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");
}
}
void Exit(Stack *s1,Stack *s2,Queue *q)
{
printf("请输入你的车位号\n");
int num;
Data data;
scanf("%d",&num);
getchar();
//printf("top:%d\n",s->top);
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);//将第一辆车移出等候队列
}
}
}
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;
/* while(q->front!=NULL)
{
printf("%d : %s\n",count,q->front->num);
q->front=q->front->next;
} */
}
int main()
{
Stack s1;
Init1(&s1);
Stack s2;
Init1(&s2);
Queue q;
Init2(&q);
char order[10];
while(1)
{
int count=len(q)-1;
int i=SIZE-(s1.top)-1;
system("clear");
printf("*****************目前停车场状况***********************\n");
printf("***************当前车库还剩%d个车位********************\n",i);
printf("***************等候区有%d辆车在等候********************\n",count+1);
printf("--------------Welcome to Our Parking------------------\n");
printf(" 1、停车 \n");
printf(" 2、离开 \n");
printf(" 3、查看停车场停车状况 \n");
printf(" 4、退出 \n");
printf("------------------------------------------------------\n");
fgets(order,10, stdin);
system("clear");
switch(order[0])
{
case PARK:
park(&s1,&q);
break;
case EXIT:
Exit(&s1,&s2,&q);
break;
case DISPLAY:
Display(&s1,&q);
break;
case QUIT:
return;
default:
printf("输入错误,请重新输入!\n");
break;
}
printf ("\t\t按Enter键返回\n");
getchar();
}
return 0;
}
Stack.c
#include <time.h>
#include "Stack.h"
#include <stdlib.h>
#include <string.h>
//顺序栈------------------------------------
void Init1(Stack *s)
{
if (NULL==s)
return;
s->top=-1;
}
BOOL Empty1(Stack *s)
{
if (NULL==s)
return;
if(s->top==-1)
return TRUE;
return FALSE;
}
BOOL Full1(Stack *s)
{
if (NULL==s)
return;
if(s->top==SIZE-1)
return TRUE;
return FALSE;
}
void Push1(Stack *s,Data data)
{
if (NULL==s)
return;
if(TRUE==Full1(s))
return;
s->data[++s->top]=data;
}
void Pop1(Stack *s)
{
if (NULL==s)
return;
if(TRUE==Empty1(s))
return;
s->top--;
}
Data GetTop1(Stack *s)
{
if (NULL==s)
return;
if(TRUE==Empty1(s))
exit(-1);
return s->data[s->top];
}
//链式队列---------------------------------------
void Init2(Queue *q)// 初始化队列
{
if (NULL==q)
return;
q->front=NULL;
q->rear=NULL;
}
BOOL Empty2(Queue *q)//判断空队列
{
if (NULL==q)
return FALSE;
if(q->front==NULL)
return TRUE;
return FALSE;
}
void Push2(Queue *q,char num[])//入队列
{
if (NULL==q)
return;
Node *node =(Node *)malloc(sizeof(Node)/sizeof(char));
if(node==NULL)
return;
strcpy(node->num,num);
node->next=NULL;
if(q->rear!=NULL)
{
q->rear->next=node;
q->rear=node;
}
else
{
q->rear=node;
q->front=node;
}
}
void Pop2(Queue *q)//出队列
{
if (NULL==q)
return;
if(TRUE==Empty2(q))
return;
Node *tmp=q->front;
q->front=tmp->next;
free(tmp);
if(q->front==NULL)
{
q->rear=NULL;
}
}
char *GetTop2(Queue *q)//获取队列顶元素
{
if (NULL==q)
return;
if(TRUE==Empty2(q))
exit(-1);
return q->front->num;
}