#include <stdlib.h>
#include <conio.h>
#define MAX_PARKING_SIZE 10//停車場最大停車數量
#define PRIZE 10.00//停留每小時單價
#define true 1
#define false 0
typedef struct stack
{
long pos[MAX_PARKING_SIZE];//存儲車牌號碼
int time[MAX_PARKING_SIZE];//存儲進入車站的時間
int point;//最後壹輛車的位置指針
}Stack;//定義棧-模擬停車場
typedef struct queue
{
int num;//存儲車牌號
struct queue *next;//指向下壹輛車
}Queue;//定義隊列-模擬停車場外
void InitStack(Stack *s)
{
s->point=-1;
}//初始化棧
Queue *InitQueue()//初始化隊列
{
Queue *q;
q=(Queue *)malloc(sizeof(Queue));
q->next=NULL;
return q;
}
int StackPop(Stack *s,long *i,int *j)//退棧函數
{
if(s->point==-1)return false;
else
{
*i=s->pos[s->point];
*j=s->time[s->point];
s->point--;
return true;
}
}
int StackPush(Stack *s,long i,int j)//壓棧函數
{
if(s->point==MAX_PARKING_SIZE-1)return false;
else
{
s->point++;
s->pos[s->point]=i;
s->time[s->point]=j;
return true;
}
}
int QueuePop(Queue **qH,long *i)//退隊函數
{
Queue *temp;
if((*qH)->next==NULL)return false;
else
{
temp=(*qH)->next;
(*qH)->next=temp->next;
*i=temp->num;
free(temp);
return true;
}
}
int QueuePush(Queue **q,long i)//入隊函數
{
Queue *temp;
if((temp=(Queue *)malloc(sizeof(Queue)))==NULL)return false;
else
{
(*q)->next=temp;
temp->num=i;
temp->next=NULL;
*q=temp;
return true;
}
}
int main()
{
int time,i,j,inStack,inQueue;
long num;
char state;
Stack park;
Queue *H,*p,*temp,*temp2;
H=InitQueue();
p=H;
system("color 9E");
InitStack(&park);//初始化隊列和棧
printf("**********這裏是停車場管理程序,歡迎使用**************\n");
printf("\n停車場最大能停車%d輛,停車時間不得超過24小時,現在停車的單價為每小時%.2f元\n",MAX_PARKING_SIZE,PRIZE);
while(1)
{
inStack=inQueue=0;temp=H;
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃ 停車場管理系統 ┃\n");
printf("┃ (A或a)汽車到達和已到汽車查詢 ┃\n");
printf("┃ (D或d)汽車離開 ┃\n");
printf("┃ (E或e)程序退出 ┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\n您的選擇是:");
state=getche();
if(state=='a'||state=='A'||state=='d'||state=='D')
{
printf("\n輸入車牌號(數字):");
scanf("%ld",&num);
printf("\n輸入到達或查詢或離開的的時間(24小時制,單位:小時):");
scanf("%d",&time);
}
if(state=='a'||state=='A')
{
for(i=0;i<=park.point;i++)
if(park.pos[i]==num)
{
inStack=1;
break;
}//在車站中查找
for(j=1;temp->next!=NULL;j++)
{
temp2=temp;
temp=temp2->next;
if(temp->num==num)
{
inQueue=1;
break;
}
}//在車站外查找
if(inStack)
printf("\n查詢結果:輸入的汽車已經在車站中第%d個位置停留了%d個小時!\n",i+1,time>park.time[i]?time-park.time[i]:time+24-park.time[i]);
else if(inQueue)
printf("\n查詢結果:輸入的汽車已經在車站外第%d個位置等候\n",j);
else
{
if(StackPush(&park,num,time)==false)
{
QueuePush(&p,num);
printf("\n車站已滿,車輛停在場外。\n");
}
else printf("\n車輛成功進站!\n");
}//如果車輛到達,當車站已滿,停在車站外,否則,進入車站
}
else if(state=='d'||state=='D')//如果是離開
{
for(i=0;i<=park.point;i++)
if(park.pos[i]==num)
{
inStack=1;
break;
}//在車站中查找
if(inStack)//如果在車站中
{
printf("正要離開的汽車在車站中第%d個位置停留了%d個小時,應付%.2f元\n",i+1,time>park.time[i]?time-park.time[i]:time+24-park.time[i],time>park.time[i]?(time-park.time[i])*PRIZE:(time+24-park.time[i])*PRIZE);
while(i<park.point)
{
park.pos[i]=park.pos[i+1];
park.time[i]=park.time[i+1];
i++;
}
park.point--;//把離開的車輛從車站中刪除
if(H->next!=NULL)
{
QueuePop(&H,&num);
if(H->next==NULL)p=H;
StackPush(&park,num,time);
printf("\n停車場空出壹位置。場外等候的%d號汽車入站了!\n",num);
}//如果車站外有車,入站
}
else//不在車站中
{
for(i=1;temp->next!=NULL;i++)
{
temp2=temp;temp=temp2->next;
if(temp->num==num)
{
inQueue=1;
break;
}
}//查找是否在車站外
if(inQueue)
{
printf("\n汽車在停車場外,不收費\n",i);
temp2->next=temp->next;
if(temp==p)p=temp2;
free(temp);
}//在車站外
else printf("\n對不起,您輸入了不存在的車牌號!\n");
}
}
else if(state=='e'||state=='E')
{
printf("\n");
break;
}
else printf("\n輸入錯誤!\n");
}
return 0;
}