堆栈、队列实训(停车场系统)

设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端);
若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可进入;
当停车场某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场;
汽车可以直接从便道上离开。离开时排在前面的车也应该为其让道,随后应回到原来的位置。
每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。交费按车的类型不同而不同,假定小车每小时2元,客车每小时3元,卡车每小时5元。停在便道上的车也要交费,假设其费用为停车场的车的1/3。
停车只限于当天0点至24点。
编写程序实现上面要求的停车场停车管理功能。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define STACKSIZE 5
/*-----------车辆数据结构定义-------------*/
typedef struct{
   int BNo;             //车辆编号
   int type;            //车辆类型
   int arrivetime;      //到达车场时间
   int pushtime;        //进入停车场时间
   int departuretime;   //离开车场时间
   }BUSINF;
/*------------链队列结点结构定义-----------*/
typedef struct QNODE{
   BUSINF elm;
   struct QNODE *next;
   }QNODE;
/*------------顺序栈结构定义----------------*/
struct SqStack{
  BUSINF elm[STACKSIZE];
  int top;
  }stack;
/*-------------链队列结构定义---------------*/
struct LinkQueue{
   QNODE *front;
   QNODE *rear;
   }Queue;
/*-----------车辆收费标准定义----------------*/
int pay[]={0,2,3,5};
/*-------------------------------------------*/
/*             判栈空函数                    */
/*  参  数:struct SqStack stack--指定栈     */
/*  返回值:0--栈不空; 1--栈空              */
/*-------------------------------------------*/
int StackEmpty(struct SqStack stack)
{ 
(学生完成)
  }
/*-------------------------------------------*/
/*             判栈满函数                    */
/*  参  数:struct SqStack stack--指定栈     */
/*  返回值:0--栈不满; 1--栈满              */
/*-------------------------------------------*/
int StackFull()
{ 
(学生完成)
  }
/*-------------------------------------------*/
/*             顺序栈入栈函数                */
/*  参  数:struct SqStack *stack--栈指针    */
/*          BUSINF Bus--入栈车辆数据         */
/*  返回值:无                               */
/*-------------------------------------------*/
void push(struct SqStack *stack,BUSINF Bus)
  { 
(学生完成)
   }
/*-------------------------------------------*/
/*             顺序栈出栈函数                */
/*  参  数:struct SqStack *stack--栈指针    */
/*          BUSINF *Bus--返回车辆数据指针    */
/*  返回值:无                               */
/*-------------------------------------------*/
void pop(struct SqStack *stack,BUSINF *Bus)
 {  
(学生完成)
    }
/*-------------------------------------------*/
/*             链栈入栈函数                  */
/*  参  数:QNODE *stack--栈指针             */
/*          QNODE *p--入栈结点指针           */
/*  返回值:无                               */
/*-------------------------------------------*/
void LPush(QNODE *stack,QNODE *p)
  { 
p->next=stack->next;
       stack->next=p;
    }
/*-------------------------------------------*/
/*             链栈出栈函数                  */
/*  参  数:QNODE *stack--栈指针             */
/*          QNODE **p--返回结点指针          */
/*  返回值:无                               */
/*-------------------------------------------*/
void LPop(QNODE *stack,QNODE **p)
 {  
(*p)=stack->next;
        stack->next=(*p)->next;
    }
/*-------------------------------------------*/
/*             链队列初始化函数              */
/*  参  数:无                               */
/*  返回值:无                               */
/*-------------------------------------------*/
void InitQueue(void)
{ 
(学生完成)
  }
/*-------------------------------------------*/
/*             判队列空函数                  */
/*  参  数:无                               */
/*  返回值:0--队列不空; 1--队列空          */
/*-------------------------------------------*/
int QueueEmpty(void)
{ 
     (学生完成)
  }
/*-------------------------------------------*/
/*             入队操作函数                  */
/*  参  数:BUSINF Businf--入队车辆数据      */
/*  返回值:无                               */
/*-------------------------------------------*/
void EnQueue(BUSINF Businf)
 { 
QNODE *p;
       p=(QNODE *)malloc(sizeof(QNODE));
      (学生完成)
   }
/*-------------------------------------------*/
/*             出队操作函数                  */
/*  参  数:BUSINF *Businf--返回车辆数据指针 */
/*  返回值:无                               */
/*-------------------------------------------*/
void DeQueue(BUSINF *BusInf)
{ 
QNODE *p;
      (学生完成)
  }
/*-------------------------------------------*/
/*             栈数据查找函数                */
/*  参  数:int BusNo--待查找的车辆编号      */
/*  返回值:int:>=0--数据在栈中的位置        */
/*              -1--查找失败                 */
/*-------------------------------------------*/
int SearchStack(int BusNo)
{ int k;
     k=stack.top-1;
      while(k>=0&&BusNo!=stack.elm[k].BNo) k--;
      return(k);
  }
/*-------------------------------------------*/
/*             队列数据查找函数              */
/*  参  数:int BusNo--待查找的车辆编号      */
/*  返回值:队列结点指针:NULL--查找失败      */
/*              非空--查找成功,数据结点指针 */
/*-------------------------------------------*/
QNODE *SearchQueue(int BusNo)
{ 
QNODE *p;
      p=Queue.front->next;
      while(p!=NULL&&p->elm.BNo!=BusNo) p=p->next;
      return(p);
  }
/*-------------------------------------------*/
/*             收费计算与显示函数            */
/*  参  数:BUSINF BusInf--离开车辆的数据    */
/*  返回值:无                               */
/*-------------------------------------------*/
void CalcultPay(BUSINF BusInf)
{ int payment;
  if(BusInf.arrivetime!=0&&BusInf.pushtime==0)
 payment=(BusInf.departuretime-BusInf.arrivetime)*pay[BusInf.type]/3.0;
  else if(BusInf.arrivetime!=0&& BusInf.pushtime!=0)
     payment=(BusInf.pushtime-BusInf.arrivetime)*pay[BusInf.type]/3.0+
                (BusInf.departuretime-BusInf.pushtime)*pay[BusInf.type];
  else payment=(BusInf.departuretime-BusInf.pushtime)*pay[BusInf.type];
  printf("    **********************************\n");
  printf("    *      payment=%4d              *\n",payment);
  printf("    **********************************\n");
  getch();
  }
/*-------------------------------------------*/
/*        进场车辆数据录入与管理函数         */
/*  参  数:无                               */
/*  返回值:无                               */
/*-------------------------------------------*/
void InputArrialData()
{ int BusNo,arrivetime,BusType;
  BUSINF arrive;
     (学生完成)
   }
/*-------------------------------------------*/
/*        离场车辆数据录入与管理函数         */
/*  参  数:无                               */
/*  返回值:无                               */
/*-------------------------------------------*/
void InputDepartData()
{ int BusNo,departtime;
  BUSINF depart,temp;
  QNODE *p,*pri,*q;
  QNODE *LStack;
  struct SqStack TempStack;
      (学生完成)
  }
/*-------------------------------------------*/
/*        列表显示车场车辆数据函数           */
/*  参  数:无                               */
/*  返回值:无                               */
/*-------------------------------------------*/
void OutputBusData(void)
{ int i;
  QNODE *p;
  printf("\n    stop:\n");
  printf("     CarNo   Arriave    Push\n");
  printf("stack top=%d\n",stack.top);
  getch();
  for(i=0;i<stack.top;i++)
    printf("%8d%8d%10d\n",stack.elm[i].BNo,stack.elm[i].arrivetime,
       stack.elm[i].pushtime);
  if(Queue.front->next)
   { printf("\n    path:\n");
     p=Queue.front->next;
     while(p)
       { printf("    %d     %d\n",p->elm.BNo,p->elm.arrivetime);
     p=p->next;
     }
     }
  }
/*-------------------------------------------*/
/*               撤销队列函数                */
/*  参  数:无                               */
/*  返回值:无                               */
/*-------------------------------------------*/
void DestroyQue()
  { QNODE *p,*q;
    p=Queue.front;
    while(p)
     { q=p;
       p=p->next;
       free(q);
       }
    }
/*-------------------------------------------*/
/*               菜单选择函数                */
/*  参  数:无                               */
/*  返回值:int:取值1--3                     */
/*-------------------------------------------*/
int nemu()
{
    char m;
    printf("\n    ************* BUS Manage **************\n");
    printf("    *%15c1---Arrival%12c\n",' ','*');
    printf("    *%15c2---Departure%10c\n",' ','*');
    printf("    *%15c3---End%16c\n",' ','*');
    printf("    ***************************************\n");
    printf("%15cSelcet 1,2,3: ",' ');
    do{
         m=getch();
         }while(m<'1' || m>'3');
     printf("\n");
     return(m-48);
}
void main()
{ stack.top=0;
  InitQueue();
  while(1)
    {
       switch(nemu())
        {
         case 1:
            InputArrialData();
            OutputBusData();
            break;
         case 2:
            InputDepartData();
            OutputBusData();
            break;
         case 3:
            OutputBusData();
            DestroyQue();
            return;
         }
    }
}

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。