#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"time.h"
#define null 0
#define Maxsize 20//定义最大停车辆数
void clear(char a[])
{
int i,counta;
counta=strlen(a);
for(i=0;i<counta;i++)
a[i]='\0';
}
struct car//定义车的结构体
{
char num[6]; //车牌号
char intime[10]; //进站时间
char outtime[10]; //出站时间
int expense; //费用
int delay; //停留时间
int position; //停车位置
};
typedef struct
{
struct car d[Maxsize];
int top;
}SeqStack;
void init(SeqStack *s)//初始化栈
{
s->top=-1;
}
int isemptystack(SeqStack *s)//判断栈是否为空
{
if(s->top==-1)
return 1;
else
return 0;
}
int isfullstack(SeqStack *s)//判断栈是否为满
{
if(s->top==Maxsize-1)
return 1;
else
return 0;
}
void push(SeqStack *s,struct car x)//进栈
{
if(!isfullstack(s))
{
s->top++;
s->d[s->top]=x;
}
}
struct car pop(SeqStack *s)//取栈顶元素,出栈
{
car x;
if(s->top!=-1)
{
x=s->d[s->top];
s->top--;
return x;
}
}
car gettop(SeqStack*s)//取栈顶元素
{
car x;
if(s->top!=-1)
{
x=s->d[s->top];
return x;
}
}
typedef struct slnode//定义链队列的结点性质
{
struct car data;
struct slnode *next;
}slnodetype;
typedef struct //定义链的性质
{
slnodetype *head;
slnodetype *rear;
}linkq;
void initq(linkq*q)//初始化链队列
{
q->head=(slnodetype*)malloc(sizeof(slnodetype));
q->rear=q->head;
q->head->next=null;
q->rear->next=null;
}
void addq(linkq*q,struct car x)//进队列
{
slnodetype *p;
p=(slnodetype*)malloc(sizeof(slnodetype));
p->data=x;
p->next=null;
q->rear->next=p;
q->rear=p;
}
struct car delq(linkq *q)//出链队列
{
slnodetype *p;
struct car x;
if(q->head!=q->rear)
{
p=q->head->next;
if(p->next==null)
{
x=p->data;
q->rear=q->head;
free(p);
}
else
{
q->head->next=p->next;
x=p->data;
free(p);
}
return x;
}
}
int isemptyq(linkq *q)//判断链队列是否为空
{
if(q->rear==q->head)
return 1;
else
return 0;
}
void printstack(SeqStack *s)//车进站时输入信息显示,及提示站内情况
{
int i;
if(isemptystack(s))
printf("车站内没有车。");
else
{
printf("\t\t车站内\n位置\t车牌\t进站时间\t 站内状况\n");
for(i=0;i<=s->top;i++)
{
printf("\n");
printf("%d\t",s->d[i].position);
printf("%s\t",s->d[i].num);
printf("%s\t",s->d[i].intime);
}
printf("共%d辆",s->top+1);
if(s->top==Maxsize-1)
printf("(已满)\n");
else
printf("(还能放%d辆)\n",Maxsize-1-s->top);
printf("\n");
}
}
void printout(struct car *x)//出站时的信息
{
printf("车牌 进站时间 进/出站 出站时间 原来位置 停留时间(秒) 费用(角)\n");
printf("%s ",x->num);
printf("%s ",x->intime);
printf("出 ");
printf("%s\t",x->outtime);
printf("%d\t",x->position);
printf("%d\t",x->delay);
printf("\t%d\n",x->expense);
}
void printq(linkq *q) //进过道信息
{
if(!isemptyq(q))
{
slnodetype*p;
p=q->head->next;
printf("\t过道:\n车牌:\t进道时间:\n");
printf("%s\t%s\n",p->data.num,p->data.intime);
while(p->next!=null)
{
p=p->next;
printf("%s\t%s\n",p->data.num,p->data.intime);
}
}
else
printf("\n过道上有没有车在等待\n");
}
void review(SeqStack*s,linkq*q)//查看车站和过道上的情况
{
printf("*******************************************************\n");
printstack(s);
printq(q);
printf("*******************************************************\n");
}
void gettime(char a[])//获取时间
{
int i;
static char nowtime[30];
time_t t;
time(&t);
strcpy(nowtime,ctime(&t));
for(i=0;i<9;i++)
nowtime[i]=nowtime[i+11];
nowtime[i]='\0';
strcpy(a,nowtime);
}
void incar(SeqStack*s,linkq*q) //车进站(即输入IN后)
{
int i;
int flg;
struct car k;
static char nowtime1[10];
printf("请你输入车牌(2-5位):\n");
gets(k.num);
if(strlen(k.num)<2||strlen(k.num)>5)
{
printf("车牌号位数不对!");
return;
}
for(i=0;i<=s->top;i++)
if(!(strcmp(k.num,s->d[i].num)))
flg=1;
while(1)
{
if(flg==1)
{
printf("车牌号已存在!\n");
printf("请输入回车符!\n");
gets(k.num);
return;
}
else
break;
}
gettime(nowtime1);
strcpy(k.intime,nowtime1);
if (!isfullstack(s)&&isemptyq(q)) //若车站不满,而且过道上没有车,则直接进入车站
{
k.position=(s->top)+2;
push(s,k);
printstack(s);
}
else
if(isfullstack(s)||!isemptyq(q))//若过道上还有车,则必须放在过道上
{
printf("*************************警告************************\n车站已满,请暂时放在过道。\n现在情况如下:\n");
k.position=Maxsize;
addq(q,k);//放在过道上
printstack(s);//输入车站情况
printq(q);//同时输入当时过道上的情况
printf("*****************************************************\n");
}
}
void outcar(SeqStack *s,linkq *q) //车出站
{
SeqStack p; //申请临时放车的地方
init(&p);
char nowtime[10];
int i,pos;
long cost;
int hour,min,sec;
struct car x,b,y1,y2,z;
if(isemptystack(s))
{
printf("车站是空的,不能再出站了!\n");
printf("\a");
}
else
{
printf("现在车站的情况是:\n");
printstack(s);
printf("你要出站的车的序号是:\n");
scanf("%d",&pos);
if(pos>0&&pos<=s->top+1)
{
for(i=s->top+1;i>pos;i--)
{
x=pop(s);
x.position=x.position-1;
push(&p,x);
}
b=pop(s);
gettime(nowtime);
strcpy(b.outtime,nowtime);
hour=(b.outtime[0])*10+(b.outtime[1])-((b.intime[0])*10+(b.intime[1]));
min=(b.outtime[3])*10+(b.outtime[4])-((b.intime[3])*10+(b.intime[4]));
sec=(b.outtime[6])*10+(b.outtime[7])-((b.intime[6])*10+(b.intime[7]));
b.delay=hour*3600+min*60+sec;
cost=b.delay;
b.expense=cost;
printout(&b);//输出车出站时的情况---进入时间,出站时间,原来位置,花的费用等
while(!isemptystack(&p)) //车出来后把刚才退出的车重新放回
{
z=pop(&p);
push(s,z);
}
if(!isfullstack(s)&&!isemptyq(q))
{
y1=delq(q);
strcpy(y1.intime,nowtime);
push(s,y1);
}
while(!isfullstack(s)&&!isemptyq(q))
{
y2=delq(q);
push(s,y2);
}
}
else
{
printf("有没有你要的车号\n");
printf("\a");
}
}
}
void main()
{
SeqStack park;
linkq q;
init(&park);
initq(&q);
char mess[10];
printf("\t\t\t~~~ 车场管理系统 ~~~ \n\t\t\t\n**************************************************************************\n\n");
printf("提示:车站内最多只能放Maxsize(由系统中定义)辆车,多余的暂时放在过道上。\n车站内收费标准:1角/秒,过道上不收费。\n");
printf("\n你想进行什么操作?\nIN---> 车进站\nOUT--->车出站\nLIST--->查看车站及过道中的情况\nHELP--->获取帮助\nEND--->退出系统\n");
printf("\n操作:");
gets(mess);
while(1)
{
if(strcmp(mess,"END")==0)
{
printf("\t\t\t欢迎下次再来,再见!\n");
break;
}
else if(strcmp(mess,"HELP")==0)
{
printf("\n你想进行什么操作?\nIN--->车进站\nOUT--->车出站\nLIST--->查看车站及过道中的情况\nHELP--->获取帮助\nEND--->退出系统\n\n");
printf("操作:");
clear(mess);
gets(mess);
}
else
{
if(strcmp(mess,"LIST")==0)
{
review(&park,&q);
printf("操作:");
}
else if(strcmp(mess,"IN")==0)
{
incar(&park,&q);
printf("操作:");
}
else if(strcmp(mess,"OUT")==0)
{
outcar(&park,&q);
}
else
printf("操作:");
clear(mess);
gets(mess);
}
}
}
//问题:车牌号位数且车牌号可以重复