停车场问题

来源:互联网 发布:家装软件 编辑:程序博客网 时间:2024/04/20 04:51

#include < stdio.h  >
#include < stdlib.h >
#include < malloc.h >

int Mark=0;
typedef struct stack
{//定义停车场数据类型
 int   *base;
 int   *top;
 int   stacksize;
}stack;//完成停车堆栈数据类型定义

void InitStack ( stack &s )
{//构造一个空栈s
 s.base = (int *) malloc (s.stacksize * sizeof(stack));
 if(!s.base) exit(1);//分配空间失败
 s.top = s.base;
}//完成空堆栈的构造

void Push( stack &s , int e , int f)
{//插入一辆新车进入停车场
 s.base = (int *) realloc (s.base , (s.stacksize +2) * sizeof(stack));
 if(!s.base) exit(1);//分配空间失败
 s.top = s.base + s.stacksize ;
 s.stacksize += 2;
 * s.top++ = e;
 * s.top++ = f;
}//完成压入一个元素的操作

void Pop( stack &s , int &e , int &f)
{//若停车场不空,则删除S的栈顶元素,用e返回车牌号,用f返回进入停车场的时间
 if(s.top == s.base)
 {
  printf("ERROR/n");
  exit(1);
 }
 f=* --s.top;
 e=* --s.top;
}//完成弹出一个元素的操作

typedef struct queue
{//定义便道的数据类型
 int carnum;
 int time;
 queue *next;
}queue;//完成便道的数据类型定义并重命名

typedef struct
{//定义指针
 queue *front;
 queue *rear;
}linkqueue;//完成便道的指针创建

void InitQueue(linkqueue &Q)
{//构造一个空的队列Q
 Q.front = Q.rear = (queue *)malloc(sizeof(queue));
 if(!Q.front)
  exit(1);//分配空间失败
 Q.front->next = NULL ;
}//空队列Q创建完毕

void EnQueue(linkqueue &Q, int e, int f)
{//插入新元素到Q的队尾作为新的队尾元素
 queue *p;
 p = (queue *)malloc(sizeof(queue));
 if(!p)
  exit(1);//分配空间失败
 p->carnum = e;
 p->time = f;
 p->next=NULL;
 Q.rear->next = p;
 Q.rear = p;
 Mark++;
}//完成进入便道的操作

void DeQueue(linkqueue &Q,int &e,int &f)
{//若队伍不空,则队头元素出队
 queue *p;
 p = (queue *)malloc(sizeof(queue));
 if(Q.front == Q.rear)exit(1);//分配空间失败
 p = Q.front->next;
 e = p->carnum;
 f = p->time;
 Q.front->next = p->next;
 if(Q.rear == p)
  Q.rear=Q.front;
 free(p);
 Mark--;
}//完成驶出便道操作

int main()
{
 int I;//停车场容量
 int carnum;//车牌号码
 int time;//进入时间
 char ch;//操作要求
 int J;//设置便道标志
 int i;//循环计数器
 int Marks;//便道标志位
 printf("请输入停车场容量: ");
 scanf("%d" , &I);
 printf("/n");
 printf("请输入操作要求: ");
 getchar();
 scanf("%c" , &ch);
 stack S1;
 S1.stacksize=1;
 stack S2;
 S2.stacksize=1;
 linkqueue Q2;
 InitStack(S1);//完成队列堆栈的初始化
 InitStack(S2);
 InitQueue(Q2);
 J=0;
 Marks=0;
 while(ch!='E')
 {
  switch(ch)
  {
  case 'A':
  case 'a':
   printf("/n请输入车牌号码:");
   scanf(" %d",&carnum);
   printf("/n请输入进入停车场的时间:");
   scanf(" %d",&time);
   if(I!=0)//判断堆栈是否已满
   {
    Push(S1,carnum,time);//压入车辆
    I--;
    printf("/n您的车辆已经进入停车场内,并开始计费!/n");
    break;
   }
   else
   {
       EnQueue( Q2,carnum,time);
    J++;
       printf("/n车辆停留在便道,不收取费用!/n");
       break;
   }
  case 'D':
  case 'd':
   printf("/n请输入要开走的车辆的车牌号码:");
   scanf("%d", &carnum);
   printf("/n请确认当前时刻: ");
   scanf("%d",&time);
   int comcarnum;//比较车牌信息
   int comtime;//比较时间信息
   Pop(S1,comcarnum,comtime);
   I++;
   if(comcarnum == carnum)
   {
    printf("/n停车时间为:%d分钟/n",time - comtime);
    if(J>=1)
    {
                    DeQueue(Q2,comcarnum,comtime);
        comtime = time;
     J--;
        Push(S1,comcarnum,comtime);
        I--;
        break;
    }
    else
     break;
   }
   Push(S2,comcarnum,comtime);
   Pop(S1,comcarnum,comtime);
   I++;
      if(comcarnum == carnum)
       {
        printf("/n停车时间为:%d/n",time - comtime);
     Pop(S2,comcarnum,comtime);
        Push(S1,comcarnum,comtime);
        I--;
     if(J>=1)
     {
             DeQueue(Q2,comcarnum,comtime);
             comtime = time;
             Push(S1,comcarnum,comtime);
             I--;
             break;
     }
     else
      break;
       }
          Push(S1,comcarnum,comtime);
          I--;
          Pop(S2,comcarnum,comtime);
          Push(S1,comcarnum,comtime);
          I--;
       for(i=0;i!=Mark;i++)
       {
        DeQueue(Q2,comcarnum,comtime);
        if(comcarnum==carnum)
        {
         printf("/n您的车停留在便道内,不收费!/n");
         Marks=1;
         Mark++;
        }
        else
        {
         EnQueue(Q2,comcarnum,comtime);
        }
       }
       if(Marks==1)
       {
        Mark--;
                       Marks=0;
       }
       else
        printf("/n您的车没有停在此处/n");
          break;
  default:
   printf("您的输入有误,请重新输入所要执行的操作!/n");
   break;
  }
  printf("/n请输入操作要求:");
  getchar();
  scanf("%c",&ch);
 }
 return 0;
}//完成停车场的基本操作

最新修改的停车场问题,加入便道测试的功能,希望大家能给与测试,麻烦各位了!