#include<iostream>
using namespace std;
#include<stdlib.h>
#define N 2 //泊车位数
//struct类型定义
typedef struct //汽车类型定义--顺序栈
{
int NO;
int time;
}Car;
typedef struct //停车场类型定义--顺序栈
{
int end;
int front;
Car car[N];
}ParkStack;
typedef struct carnode //汽车类型定义--链队列
{
int NO;
int time;
int place;
struct carnode *next;
}CNode;
typedef struct //便道类型定义--链队列
{
CNode *cnode;
}Queue;
//初始化栈--创建停车场
void InitStack(ParkStack *park)
{
park->end=park->front=-1;//栈底下标等于栈顶下标等于-1
}
//入栈--汽车到达停车场
int InsertStack(ParkStack *park)
{
int no,time;
if(park->front==N-1)
return 0;
cout<<"输入车牌号(整数)和到达时刻(整数[分钟]):";//一辆车到达
cin>>no>>time;
park->front++;
park->car[park->front].NO=no;
park->car[park->front].time=time;
cout<<"车牌号为: ["<<no<<"]停在停车场第["<<park->front+1<<"]位置"<<endl;
return 1;
}
//初始化链队列--创建便道
CNode *InitQueue(Queue *queue)
{
CNode *head;
head=(CNode*)malloc(sizeof(CNode));//设立头结点
head->next=NULL;
head->place=0;
queue->cnode=head;
return head;
}
//入队列--汽车到达便道
void InsertQueue(Queue *queue)
{
int no,time;
CNode *cp;
cp=(CNode*)malloc(sizeof(CNode));//生成一个结点
cout<<"输入车牌号(整数)和到达时刻(整数[分钟]):";//一辆车到达
cin>>no>>time;
queue->cnode->next=cp;
cp->place=queue->cnode->place;
cp->place++;
queue->cnode=cp;
cp->NO=no;
cp->time=time;
cp->next=NULL;
cout<<"车牌号为: ["<<no<<"]停在便道上第["<<cp->place<<"]位置"<<endl;
}
//临时入栈
void InsertTempStack(ParkStack *temp,ParkStack *park)
{
temp->front++;
temp->car[temp->front].NO=park->car[park->front].NO;
temp->car[temp->front].time=park->car[park->front].time;
park->front--;//出栈--停车场汽车暂时少一辆
}
//出队--便道内的汽车开进停车场
void DelQueue(CNode *head,ParkStack *park,int time,Queue *queue)
{
CNode *cp,*tp;
park->front++;
cp=head->next;
park->car[park->front].NO=cp->NO;
park->car[park->front].time=time;
head->next=cp->next;
int k=0;
for(tp=head->next;tp!=NULL;tp=tp->next)
{
tp->place--; k=1;
}
if(k==0)
queue->cnode=head;
free(cp);
}
//出栈--汽车离开停车场
void OutCarStack(ParkStack *park,ParkStack *temp,CNode *head,Queue *queue)
{
if(park->end==park->front)
{
cout<<"停车场内无车可离开"<<endl;
return ;
}
if(park->front<N-1)
{
int no,time,k=-1;
cout<<"输入车牌号和离开时刻[分钟]: ";
cin>>no>>time;
for(int i=0;i<=park->front;i++)
if(park->car[i].NO==no)
{
k=i;break;
}
if(k==-1)
{
cout<<"停车场内无此汽车"<<endl;
return ;
}
int k1=0;
for(int i1=park->front;i1>=k+1;i1--)
{
InsertTempStack(temp,park);
k1=1;
}
cout<<"停在停车场内车牌号为: ["<<no<<"]应交纳的费用为(停留时间*1元/分钟):"<<time-park->car[k].time<<"元"<<endl;
park->front--;
if(k1==1)
for(int i=0;i<=temp->front;i++)
InsertTempStack(park,temp);
return ;
}
if(park->front==N-1)
{
int no,time,k=-1;
cout<<"输入车牌号和离开时刻[分钟]: ";
cin>>no>>time;
for(int i=0;i<=park->front;i++)
if(park->car[i].NO==no)
{
k=i;break;
}
if(k==-1)
{
cout<<"停车场内无此汽车"<<endl;
return ;
}
int k1=0;
for(int i2=park->front;i2>=k+1;i2--)
{
InsertTempStack(temp,park);
k1=1;
}
cout<<"停在停车场内车牌号为: ["<<no<<"]应交纳的费用为(停留时间*1元/分钟): "<<time-park->car[k].time<<"元"<<endl;
park->front--;
if(k1==1)
for(int i=0;i<=temp->front;i++)
InsertTempStack(park,temp);
if(head->next!=NULL)
DelQueue(head,park,time,queue);
return ;
}
}
//主函数main()
int main()
{
int k; char ch;
ParkStack park,temp;
Queue queue;
CNode *head; //保存头结点的指针
InitStack(&park); //创建停车场
head=InitQueue(&queue); //创建便道
InitStack(&temp); //初始化临时栈
cout<<"A-----------车辆到达"<<endl;
cout<<"D-----------车辆离开"<<endl;
cout<<"E-----------结束"<<endl;
while(1)
{
l1:cout<<"请选择: "; cin>>ch;
if(ch<'A'||ch>'E')
{cout<<"格式错误"<<endl; goto l1;}
switch(ch)
{
case 'A':{
k=InsertStack(&park);
if(k==0) InsertQueue(&queue);break;
}
case 'D':{
OutCarStack(&park,&temp,head,&queue);break;
}
case 'E':cout<<"结束操作"<<endl;exit(0);
}
}
return 0;
}