停车场管理(c语言顺序栈和链队列的方式实现)

数据结构——用c语言描述 停车场管理(顺序栈和链队列的方式实现)

1.描述 车库(栈)中最多停车辆50辆;

  1. 车库停满后进入车库口便道(队列)排队,车库有空位时从便道进入车库停车
#include<stdio.h>
#include<stdlib.h>
#include <string.h>//引用strcmp函数(较字符串是否相等)和strcpy(字符串复制 ) 
#include<stdbool.h>
# define size 50
typedef struct{//栈 
	char elem[size][size];
	int starttime[size];
	int endtime[size];
	int top;
}stack1; 
typedef struct queue2{//队列 
	char elem[size];
	struct queue2 *next;
}queue2;
typedef struct
{
	queue2 *front;
	queue2 *rear;
} queue;
void initStack1(stack1 *s)//初始化 
{
	printf("初始化1完成\n");
	s->top=-1;
}
void initqueue2(queue *q)//初始化 
{
	q->front=(queue2 *)malloc(sizeof(queue2));
	if(q->front!=NULL)
	{      q->rear=q->front;
	       q->front->next=NULL; 
			printf("初始化队列2完成\n");
	}
	else
		printf("初始化队列2失败\n"); 
	
}
_Bool isfull(stack1 *s){   //判1号栈是否为满(即车库的车位是否满) 
	if(s->top<=size-1)
	return 0;
	else
	return 1;
}
int enterqueue2(queue *q,char str[])//进队列 (准备排队进入车库) 
{	printf("\n您已经进入便道排队,请等待......"); 
   int i=0;
   queue2 *temp;
   temp=(queue2 *)malloc(sizeof(queue2));
    if(temp==NULL)
    {
    	printf("申请空间失败\n");
    	return 0;
	}
	else if (str[i]!='\0')
    {   	
	    temp->elem[i]=str[i];	
		printf("%c",str[i]);
		 i++;
	}
	
	
	temp->next=NULL;
	q->rear->next=temp;
	q->rear=temp;
	
	return 1;	
}
int pushstack(stack1 *s,char str[],int starttime,int endtime) //进栈(车库) 
{
	int i=0;
	if(s->top<=size-1)
	{
		if(s->top==-1)
		s->top++;
		else if(str[i]!='\0')
      {   	
	    s->elem[s->top][i]=str[i];	
		printf("%c",str[i]);
		 i++;
	  }
	  s->starttime[s->top]=starttime;
	  s->endtime[s->top]=endtime;
	  
	   printf("\n您当前的在车库中的位置是第%d位,开始停车是%d 结束的时间为%d,",s->top+1,s->starttime[s->top],s->endtime[s->top]);
	  s->top++;
	   
	}
	else{
		printf("\n车库栈已经满,请等待其他车出库后您在停车入库");
	}
	return 0;
	
	
}
int find(stack1 *s,char str[])//寻找车库(栈)中对应的车辆的位置 
{
	int flag=0;//确定车库中的准确位置 
	printf("\n正在检测您的车在车库中的位置...");
	int j,i;
	j=s->top;
	for(i=0;i<=j;i++)
	{
       int m,n=0;
       for(m=0;s->elem[i][m]!='\0';m++)
       {
       	if(s->elem[i][m]==str[m])
       	{
       		n++; 
		   } 
		   else break;
	   }
	/*if(strcmp(s->elem[i],str)==0)
	 {
		flag=i;
		printf("\n当前的车牌号为%s,在车库中是第%d个",s->elem[i],flag);
		break;
	  }*/
	  if(n==m)
	  {
	  	
	  	flag=i+1;
		printf("\n当前的车牌号为%s,在车库中是第%d个",s->elem[i],flag);
		break;	  	
	  }
    }
if(flag==0)
{
	printf("\n车库中暂时找不到您的爱车");
}	
return flag; 
}
int pop(stack1 *s,int flag)//出车库,同时修改车库栈中汽车的位置 
{
	int money=0;//停车费用 
	money=s->endtime[flag-1]-s->starttime[flag-1];
  printf("\n当前停车的费用为%d",money);
  printf("\n当前汽车正在准备出车库...");
  int i;
  
  for(i=flag+1;i<s->top;i++) 
  {
  	
    strcpy(s->elem[i-1],s->elem[i]);
  	s->starttime[i-1]=s->starttime[i];
  	s->endtime[i-1]=s->endtime[i];
  }
  s->top--; 
  printf("\n当前汽车完成出库.....车库中还有%d辆车",s->top);
  
	
}
int main()
{
	stack1 s1;
	queue q2;
	int choice,starttime,endtime,flag;
	char str[50];
	initStack1(&s1);
    initqueue2(&q2);
    printf("请选择到达(1)还是离去(2)退出程序(-1)\n");
	scanf("%d",&choice);
	while(choice!=-1)//-1代表退出
	{
		if(choice==1)
		{
			printf("\n您当前选择到达(1)"); 
			if(isfull(&s1)==1)
           {
           	printf("\n (1号栈) 车库位置已经达到上限,请等待,开始进入便道排队");
           	printf("请输入你的车牌号\n");
           	scanf("%s",&str);
           	enterqueue2(&q2,str);
	
			}	
			else{
				printf("\n请输入您的的车牌号");
				scanf("%s",&str);
				printf("\n请输入您的开始时间");
				scanf("%d",&starttime);
				printf("\n请输入您的结束时间");
				scanf("%d",&endtime);
				pushstack(&s1,str,starttime,endtime);
						
		    }
		    
	 } 
	 else if(choice==2)
	 {
	 	printf("\n您当前选择为退出车库(2)");
	 	printf("\n请输入您的的车牌号");
		scanf("%s",&str);
		flag=find(&s1,str);
		if(flag==1) 
		pop(&s1,flag);	 	
	 }
	 printf("\n请继续选择到达(1)还是离去(2)退出程序(-1)");
	 scanf("%d",&choice);	
 }
 printf("\n本次服务结束,欢迎下次使用");
 return 0;
  } 

3.这个有缺陷:当栈满时,车进队列,如果此时有车出栈(车库)此时栈中有空位,然而队列中等待的车无法重新进入栈(车库)中,会出现栈假满的情况,

猜你喜欢

转载自blog.csdn.net/weixin_43904021/article/details/87471068