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

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

#include <stdio.h>
#include <malloc.h>
#define N 10                    /*停车场内最多的停车数*/
#define M 10                    /*候车场内最多的停车数*/
#define Price 2             /*每单位时间停车费用*/
typedef struct
{int CarNo[N];           /*车牌号*/int CarTime[N];         /*进场时间*/int top;                /*栈指针*/
} SqStack;                  /*定义顺序栈类型,用于描述停车场*/typedef struct
{int CarNo[M];           /*车牌号*/int front,rear;         /*队首和队尾指针*/
} SqQueue;                  /*定义循环队类型,用于描述候车场*//*以下为顺序栈的基本运算算法*/
void 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)      /*进队*/
{if ((q->rear+1)%M==q->front)    /*队满*/return 0;q->rear=(q->rear+1)%M;q->CarNo[q->rear]=e;return 1;
}
int deQueue(SqQueue *&q,int &e)     /*出队*/
{if (q->front==q->rear)          /*队空的情况*/return 0;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,t;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){case 1:     /*汽车到达*/printf("输入车号和时间(设车号和时间均为整数): ");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;case 2:     /*汽车离开*/printf("输入车号和时间(设车号和时间均为整数): ");scanf("%d%d",&no,&time);for (i=0; i<=St->top && St->CarNo[i]!=no; i++);  //在栈中找if (i>St->top)printf("  >>未找到该编号的汽车\n");else{t = St->top - i;  //需要出栈的车辆数目for (j=0; j<t; j++)  //for (j=i; j<=St->top; j++)1楼评论讲的原错误写法{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;case 3:     /*显示停车场情况*/if (!StackEmpty(St)){printf("  >>停车场中的车辆:"); /*输出停车场中的车辆*/DispStack(St);}elseprintf("  >>停车场中无车辆\n");break;case 4:     /*显示候车场情况*/if (!QueueEmpty(Qu)){printf("  >>候车场中的车辆:"); /*输出候车场中的车辆*/DispQueue(Qu);}elseprintf("  >>候车场中无车辆\n");break;case 0:     /*结束*/if (!StackEmpty(St)){printf("  >>停车场中的车辆:"); /*输出停车场中的车辆*/DispStack(St);}if (!QueueEmpty(Qu)){printf("  >>候车场中的车辆:"); /*输出候车场中的车辆*/DispQueue(Qu);}break;default:    /*其他情况*/printf("  >>输入的命令错误\n");break;}}while(comm!=0);return 0;
}

第七周实践项目6 停车场模拟(栈和队列综合)相关推荐

  1. 第七周实践项目5 排队看病模拟(队列)

    编写一个程序,反映病人到医院看病,排队看医生的情况.在病人排队过程中,主要重复两件事:  (1)病人到达诊室,将病历本交给护士,排到等待队列中候诊.  (2)护士从等待队列中取出下一位病人的病历,该病 ...

  2. 第七周实践项目4 队列数组

    创建10个队列,分别编号为0-9(处理为队列数组,编号即下标).输入若干个正整数,以数字0作为结束.设输入的值为x,其个位数字的大小为i,则将x插入到编号为i的队列中.最后输出所有的非空队列. 要求将 ...

  3. 第七周实践项目3 负数把正数赶出队列

    /* *Copyright (c) 2017,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目3- 设从键盘输入一整数序列a1,a2,-an, 试编程实现:当 ...

  4. 第七周实践项目2.3 顺序环形队列

    下图是数据存储结构设计及各种操作实现的要点: /* *Copyright (c) 2017,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目2.3- *作 者 ...

  5. 第五周实践项目6 数制转换(栈)

    /* *Copyright (c) 2017,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目6-把十进制的整数转换为任一进制数输出.提示:要转换为r进制,则 ...

  6. 数组模拟栈和队列板子

    使用数组模拟数据结构栈和队列 栈:后进先出 对于栈:我们使用tt表示栈顶的下标,如果tt==0表示栈空 队列:先进先出 对于队列,我们使用hh表示队首,tt表示队尾,tt初始化为-1,判断队列是否为空 ...

  7. LinkedList 模拟栈和队列

    LinkedList 比ArrayList 提供了更多的方法,其中有两个方法可以实现栈和队列的操作. removeFirst() 移除并返回此列表中的第一个元素. removeLast() 移除并返回 ...

  8. 第7周项目6 -停车场模拟

    问题及代码 /* *Copyright (c)2016 烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:6.cpp *作 者:王修文 *完成日期:2016年10月 ...

  9. 2015级C++第14周实践项目 模板

    [项目1-排序函数模板] 已知 void Sort(int a[],int size); void Sort(double a[],int size); 是一个函数模板的两个实例,其功能是将数组a中的 ...

最新文章

  1. C#做外挂常用API
  2. Hadoop 同步集群时间ntp
  3. 堆排序python代码实现_python实现堆排序
  4. cocos2d 嵌入网页_在 cocos2d-x 中嵌入浏览器
  5. 图灵程序设计丛书 算法(第4版)pdf
  6. Vulkan开发环境配置 Win10+VS2019
  7. office未响应(2010、2013……)崩溃
  8. 大师系列之彼得•林奇层查股
  9. golang sync/atomic
  10. jboot websocket的使用
  11. 生命如此脆弱——2012观后感
  12. centos解压分卷rar_Centos下解压rar、zip文件的方法
  13. csp刷题总结(如此编码python版本)
  14. TSN(时间敏感网络)纯干货分享
  15. iOS上传图片方向不对处理
  16. Linux完全清除防火墙策略,linux下的软件防火墙iptables——规则的查看与清除、定义默认策略,...
  17. 高等数值计算方法学习笔记第4章第二部分【数值积分(数值微分)】
  18. 电磁兼容工程(Electromagnetic compatibility engineering Herry Ott )读书笔记-- 章10 数字电路接地
  19. 去掉每行行首空格及行尾空格,无空行的方法
  20. 国际工程施工中常发生的合同问题(FIDIC)(转)

热门文章

  1. 各种 分页存储过程整理
  2. Android调试之tombstone信息的分析
  3. MHA 日常维护命令集
  4. NGINX Plus 提供的在线活动监控功能
  5. I/O多路复用——select
  6. 异地备份同步校验脚本
  7. 【转】不用软件,解压Win8/Win8.1的install.wim文件
  8. 网络基础---物理层
  9. Lucene 学习笔记(一)
  10. c语言flash里能存文件吗,STM32内部FLASH打包读写