⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 停车场问题.c

📁 停车场问题——处理数据结构中的停车场问题
💻 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 + -