停车场模拟(栈和队列综合)

本文是针对数据结构基础系列网络课程(3):栈和队列的实践项目。

  设停车场是一个可停放n辆汽车的狭长死胡同,南边封口,汽车只能从北边进出(这样的停车场世间少有)。汽车在停车场内按车辆到达时间的先后顺序,最先到达的第一辆车停放在车场的最南端,依次向北排开。若车场内已停满n辆汽车,则后来的汽车只能在门外的候车场上等候,一旦有车开走,则排在候车场上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路(假定停车场内设有供车辆进出的便道,所有的司机也必须在车内随时待命),待该辆车开出大门外,其他车辆再按原次序进入车场。每辆停放在车场的车在它离开停车场时,要按停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。   

提示:以栈模拟停车场,以队列模拟车场外的候车场,有车离开时,供车辆进出的便道也应该用栈表示。按照从键盘读入的输入数据序列进行模拟管理。汽车到达和离开时,每一组输入数据包括汽车牌照号码(设为整数)以及到达或离去的时刻(为简单化,,也设为整数,如1,代表停车场开始营业的第1小时)。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或修车场上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在候车场上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。

[参考解答]

{top;/*栈指针*/} SqStack;{int CarNo[M];/*车牌号*/int front,rear;/*队首和队尾指针*/} SqQueue;InitStack(SqStack *&s){s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;}int StackEmpty(SqStack *s){return(s->top==-1);}int StackFull(SqStack *s){return(s->top==N-1);}int Push(SqStack *&s,int e1,int e2){if (s->top==N-1)return 0;s->top++;s->CarNo[s->top]=e1;s->CarTime[s->top]=e2;return 1;}int Pop(SqStack *&s,int &e1,int &e2){if (s->top==-1)return 0;e1=s->CarNo[s->top];e2=s->CarTime[s->top];s->top–;return 1;}void DispStack(SqStack *s){int i;for (i=s->top; i>=0; i–)printf(“%d “,s->CarNo[i]);printf(“\n”);}/*以下为循环队列的基本运算算法*/void InitQueue(SqQueue *&q){q=(SqQueue *)malloc (sizeof(SqQueue));q->front=q->rear=0;}int QueueEmpty(SqQueue *q){return(q->front==q->rear);}int QueueFull(SqQueue *q)/*判断队满*/{return ((q->rear+1)%M==q->front);}int enQueue(SqQueue *&q,int e)/*进队*/{;q->rear=(q->rear+1)%M;q->CarNo[q->rear]=e;return 1;}int deQueue(SqQueue *&q,int &e)/*出队*/{;q->front=(q->front+1)%M;e=q->CarNo[q->front];return 1;}void DispQueue(SqQueue *q)/*输出队中元素*/{int i;i=(q->front+1)%M;printf(“%d “,q->CarNo[i]);while ((q->rear-i+M)%M>0){i=(i+1)%M;printf(“%d “,q->CarNo[i]);}printf(“\n”);}//main函数用于模拟停车场的工作int main(){int comm;int no,e1,time,e2;int i,j;SqStack *St,*St1; //St是停车场,St1是在有车离开时,记录为该车移开位置的车辆SqQueue *Qu; //Qu是候车场InitStack(St);InitStack(St1);InitQueue(Qu);do{printf(“输入指令(1:到达 2:离开 3:显示停车场 4:显示候车场 0:退出):”);scanf(“%d”,&comm);switch(comm){(“输入车号和时间(设车号和时间均为整数): “);scanf(“%d%d”,&no,&time);if (!StackFull(St))/*停车场不满*/{Push(St,no,time);printf(” >>停车场位置:%d\n”,St->top+1);}else/*停车场满*/{if (!QueueFull(Qu))/*候车场不满*/{enQueue(Qu,no);printf(” >>候车场位置:%d\n”,Qu->rear);}elseprintf(” >>候车场已满,不能停车\n”);}break;(“输入车号和时间(设车号和时间均为整数): “);scanf(“%d%d”,&no,&time);for (i=0; i<=St->top && St->CarNo[i]!=no; i++); //在栈中找if (i>St->top)printf(” >>未找到该编号的汽车\n”);else{for (j=i; j<=St->top; j++){Pop(St,e1,e2);Push(St1,e1,e2);/*倒车到临时栈St1中*/}Pop(St,e1,e2);/*该汽车离开*/printf(” >>%d汽车停车费用:%d\n”,no,(time-e2)*Price);while (!StackEmpty(St1)) /*将临时栈St1重新回到St中*/{Pop(St1,e1,e2);Push(St,e1,e2);}if (!QueueEmpty(Qu))/*队不空时,将队头进栈St*/{deQueue(Qu,e1);Push(St,e1,time);/*以当前时间开始计费*/}}break;(!StackEmpty(St)){printf(” >>停车场中的车辆:”); /*输出停车场中的车辆*/DispStack(St);}elseprintf(” >>停车场中无车辆\n”);break;(!QueueEmpty(Qu)){printf(” >>候车场中的车辆:”); /*输出候车场中的车辆*/DispQueue(Qu);}elseprintf(” >>候车场中无车辆\n”);break;(!StackEmpty(St)){printf(” >>停车场中的车辆:”); /*输出停车场中的车辆*/DispStack(St);}if (!QueueEmpty(Qu)){printf(” >>候车场中的车辆:”); /*输出候车场中的车辆*/DispQueue(Qu);}break;default: /*其他情况*/printf(” >>输入的命令错误\n”);break;}}while(comm!=0);return 0;}

有时我们选择改变,并非经过深思熟虑,而更像是听见了天地间冥冥中的呼唤,

停车场模拟(栈和队列综合)

相关文章:

你感兴趣的文章:

标签云: