📄 停车场问题.c
字号:
//停车场管理程序
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define price 5.00
typedef struct {
char status;
int num;
int time;
} car; //定义元素类型
typedef struct {
car *base;
car *top;
int stacksize;
int n;
} sqstack; //定义栈
typedef struct LNode{
car data;
struct LNode *next;
}LNode ,*Linklist; //定义链表
void Initstack(sqstack *s,int length){
s->base=(car *)malloc(length*sizeof(car));
if(!s->base)
exit(-1);
s->top=s->base;
s->stacksize=length;
s->n=0;
}//Initstack
void push(sqstack *s,car e){
if(s->top-s->base==s->stacksize)
exit(-1);
*s->top++=e;
s->n++;
}//push
void pop(sqstack *s){
car e;
if(s->top==s->base)
exit(-1);
s->top--;
e=*s->top;
s->n--;
}//pop
int getnum(sqstack *s){
int e;
if(s->top==s->base)
return ERROR;
s->top--;
e=s->top->num;
s->top++;
return e;
} //取栈顶元素的车牌
car gettop(sqstack *s){
car e;
if(s->top==s->base)
exit(-1);
e=*--s->top;
s->top++;
return e;
} //取栈顶元素
int stackempty(sqstack *s){
if(s->top==s->base)
return 0;
else
return 1;
} //栈判空函数
Linklist Initlist(){
Linklist head;
head=(Linklist)malloc(sizeof(LNode));
head->next=NULL;
head->data.num=0;
return head;
} //建空队列
void Insertelem(Linklist ha,car c){
Linklist pa,pb;
pa=ha;
pb=(Linklist)malloc(sizeof(LNode));
pb->data=c;
ha->data.num++;
while(pa->next)
pa=pa->next;
pa->next=pb;
pb->next=NULL;
} //将元素插到队列最后去
car deleteelem(Linklist ha){
car a;
Linklist pa;
ha->data.num--;
pa=ha->next;
ha->next=pa->next;
a=pa->data;
free(pa);
return a;
} //删除链表的第一个元素
int emptylist(Linklist ha)
{ if(ha->next==NULL)
return 0;
else
return 1;
} //链表判空函数
void cin(car *c,car *k){
int tag;
tag=1;
do
{ if(tag==0)
printf("您输入的有误,请重新输入!\n");
printf("请按顺序输入车的信息并(E,0,0)结束:\n");
printf("状态(是开入输A,是开出输D):");
scanf("%c",&c->status);
scanf("%c",&c->status);
printf("车牌号(正整数):");
scanf("%d",&c->num);
printf("进出的时间(正整数):");
scanf("%d",&c->time);
tag=0;
}
while (c->status!='A' && c->status!='D' && c->status!='E' || c->num<0 || c->time<k->time);
} //输入汽车的信息
void cout(sqstack *s,Linklist ha,double fee,car *c){
car *p;
Linklist pa;
printf("停车场的状况:\n");
if(stackempty(s)){
printf("现有车辆 %d 辆,分别是:\n",s->n);
p=s->base;
while(p!=s->top){
printf("车牌为 %d, 进站时间为 %d \n",p->num,p->time);
p++;
}
}
else
printf("站内没有车!\n");
if(emptylist(ha)){
printf("便道上停有的车辆:%d,分别是:\n",ha->data.num);
pa=ha->next;
while(pa){
printf("车牌为%d,到达时间为%d\n",pa->data.num,pa->data.time);
pa=pa->next;
}
}
else
printf("便道上没有车!\n");
if(fee==-1.0)
printf("车没进站,在便道上就离去了,故不收费!\n");
else if(fee==0.0)
printf("没有车离开!\n");
else
{ printf("离去得车是:\n");
printf("车牌是%d,离站的时间是%d\n",c->num,c->time);
printf("要交的费用:%.2f\n",fee);
}
} //打印停车场的情况
main()
{ sqstack s1,s2;
char ch;
car c,k;
Linklist L,p;
int length,n=0;
double fee;
printf("输入停车场能停放车辆的数目:\n");
scanf("%d",&length);
Initstack(&s1,length);
Initstack(&s2,length);
L=Initlist();
k.num=0;
k.time=0;
k.status='b';
do
{
cin(&c,&k);
k=c;
if(c.status=='A'){
if(s1.n<length){
push(&s1,c);
}
else
Insertelem(L,c);
fee=0.0;
}
if(c.status=='D'){
if(emptylist(L) && c.num==L->next->data.num)
{ p=L->next;
L->next=p->next;
free(p);
fee=-1.0;
}
if(c.num==getnum(&s1)){
fee=price*(c.time-gettop(&s1).time);
pop(&s1);
if(emptylist(L)){
L->next->data.time=c.time;
push(&s1,deleteelem(L));
}
}
else {
while(getnum(&s1)!=c.num){
push(&s2,gettop(&s1));
pop(&s1);
}
fee=price*(c.time-gettop(&s1).time);
pop(&s1);
while(stackempty(&s2)){
push(&s1,gettop(&s2));
pop(&s2);
}
if(emptylist(L)){
L->next->data.time=c.time;
push(&s1,deleteelem(L));
}
}
}
printf("如果想输出现在停车场的状况请输入S,否则按空格继续:");
scanf("%c",&ch);
scanf("%c",&ch);
if(ch=='S')
cout(&s1,L,fee,&c);
}
while(c.status!='E' && c.num!=0 &&c.time!=0);
}//main()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -