由于本人是编程菜鸟,所以想请教一题。[问题描叙]
    设停车场是一个可停放N辆汽车的狭长通道,且只有一个大门可供汽车出入。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满N辆车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。[基本要求]
    以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息,汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现。[测试数据]
     设N=2,输入数据为:('A',1,5),('A',2,10),('D',1,15),('A',3,20),
('A',4,25),('D',4,40),('E',0,0).其中:’A’表示到达(Arrival)‘D’表示离去(Departure);‘E’表示输入结束(End)。[实现提示]
     需另设一个栈,临时停放为给要离去的汽车让路而从停车场退下来的汽车,也用顺序结构实现,输入数据按到达后离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。
谢谢大哥大姐们对小弟的帮助。

解决方案 »

  1.   

    忘了从什么地方得到的了:
    参考一下!!!本程序在tc2.0中运行通过
    #include <stdio.h>
    #include <conio.h>
    #define GARAGESIZE 3
    #define WAITLINESIZE 10
    #define OK 1
    #define ERROR 0
    #define NULL 0
    #define OVERFLOW -2
    #define PERHOUR 1.5
    typedef struct{
        int No;
        int ADtime;
    } StElem,QuElem,Elem;typedef struct{
        StElem *base;
        StElem *top;
        int stacksize;
    } SqStack;typedef struct{
        int front;
        int rear;
        QuElem *base;
    } SqQueue;typedef int status;status InitStack(SqStack *s)
    {
      s->base=(StElem *)malloc(GARAGESIZE*sizeof(StElem));
      if(!s->base)   exit(OVERFLOW);
      s->top=s->base;
      s->stacksize=GARAGESIZE;
      return OK;
    }status Push(SqStack *s,StElem e)
    {
      if(s->top-s->base==s->stacksize)  return ERROR;
      *s->top++=e;
      return OK;
    }status Pop(SqStack *s,StElem *e)
    {
      if(s->top==s->base) return ERROR;
      *e=*--s->top;
      return OK;
    }status InitQueue(SqQueue *Q)
    {
      Q->base=(QuElem *)malloc(WAITLINESIZE*sizeof(QuElem));
      if(!Q->base) return ERROR;
      Q->front=Q->rear=0;
      return OK;
    }status EnQueue(SqQueue *Q,QuElem e)
    {
      if((Q->rear+1)%WAITLINESIZE==Q->front)  return  ERROR;
      Q->base[Q->rear]=e;
      Q->rear=(Q->rear+1)%WAITLINESIZE;
      return OK;
    }
    status DeQueue(SqQueue *Q,QuElem *e)
    {
      if(Q->rear==Q->front) return ERROR;
      *e=Q->base[Q->front];
      Q->front=(Q->front+1)%WAITLINESIZE;
      return OK;
    }
    main()
    {
      float Charge;
      char Info;
      Elem Car;
      StElem CarBack,CarDepart,CarRein,CarWait;
      SqStack Garage,BackLine,GgElem,BlElem;
      SqQueue WaitLine,WlElem;
      InitStack(&Garage);
      InitStack(&BackLine);
      InitQueue(&WaitLine);
      clrscr();
      printf("\nPlease input A(arrive)/D(depart)/E(endinput) , car No.,the current time\n");
      Info=getchar();
      scanf("%d%d",&Car.No,&Car.ADtime);
      while(Info=='A'||Info=='D')
      {
    /*Car arriveled */
        if(Info=='A')
        {
    /*The garage is not full. */
          if(Garage.top-Garage.base<Garage.stacksize)
          {
    Push(&Garage,Car);
    printf("No.%d ParkPosition %d\n",Car.No,Garage.top-Garage.base);
          }
    /*The garage is already full. */
          else
          {
    EnQueue(&WaitLine,Car);
    printf("No.%d WaitPosition %d\n",Car.No,WaitLine.rear-WaitLine.front);
          }
        }
    /*Car departed */
        else
        {
          while(Car.No!=(Garage.top-1)->No&&Garage.top!=Garage.base)
          {
    Pop(&Garage,&CarBack);
    Push(&BackLine,CarBack);
          }
          if(Garage.top==Garage.base)
          {
    printf("There isn't No.%d Car. Input error!\n",Car.No);
    exit(0);
          }
          Pop(&Garage,&CarDepart);
    /*pay for the charge............*/
          Charge=(Car.ADtime-CarDepart.ADtime)*PERHOUR;
          printf("No.%d departed,Charge %3.1f\n",CarDepart.No,Charge);/*Cars which get out for the depart car rein the garage */
          while(BackLine.top!=BackLine.base)
          {
    Pop(&BackLine,&CarRein);
    Push(&Garage,CarRein);
          }/*Cars waited in the waitline get into the garage */
          if(WaitLine.rear!=WaitLine.front)
          {
    DeQueue(&WaitLine,&CarWait);
    CarWait.ADtime=Car.ADtime;
    Push(&Garage,CarWait);
    /*print the position*...........*/
    printf("\nNo.%d car get into the %dth position of the garage.\n",CarWait.No,Garage.top-Garage.base);
          }    }
        printf("\nPlease input A(arrive)/D(depart)/E(endinput) , car No.,the current time\n");
        getchar();
        Info=getchar();
        scanf("%d%d",&Car.No,&Car.ADtime);
      }
      if(Info!='E') printf("Input ERROR\n");
    }