一、需求分析
功能需求:
停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等待,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在他离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
界面需求:
输入停车场能停放的车辆数量和每小时收费价格。再输入车辆的进入/离开情况,车牌号和进入/离开时间,输出车辆的位置和离开停车场时所需的费用。
二、概要设计
接口设计
void push(int flag, struct stackstruct *p)
struct stackstruct *pop(int id, int time,int money)// 弹出一个元素,找和离开车牌相同的车,找到则输出费用,返回空,否则返回弹出的元素
struct stackstruct *pop1()//弹出临时栈的一个元素并返回
void Enqueue(struct stackstruct *p)// 停车场满,入队列操作
struct stackstruct *Dequeue(int time) //出队列操作,返回弹出的元素
数据结构设计
struct stackstruct /*栈的结构体*/
{
int id;//记录车牌
int time;//记录进入时间
struct stackstruct *pre;
struct stackstruct *next;
};
struct queuestruct /*队列的结构体*/
{
int id;
struct queuestruct *next;
};
三、详细设计
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
struct stackstruct /*栈的结构体*/
{
int id;//记录车牌
int time;//记录进入时间
struct stackstruct *pre;
struct stackstruct *next;
};
struct queuestruct /*队列的结构体*/
{
int id;
struct queuestruct *next;
};
struct stackstruct *stackhead1, *stackend1;
struct stackstruct *stackhead2, *stackend2;
struct queuestruct *queuehead, *queueend;
int stack1count, stack2count; /*栈中元素总数*/
int queuecount; /*队列中元素总数*/
void push(int flag, struct stackstruct *p)
{
struct stackstruct *stack; //临时结点
if (flag == 0) /*栈1进栈操作*/
{
if (stack1count == 0)
{
//是第一个结点
stackhead1 = (struct stackstruct *)malloc(sizeof(struct stackstruct)