⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parking_1.c

📁 停车场 堆栈模拟程序 可以用于学习堆栈和队列知识
💻 C
字号:
/*【问题描述】 
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,
依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,
则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,
在它之后进入的车辆必须先退出车场为它让路(假定停车场内没有留出车辆进出的通道),待该辆车开出大门外,
其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 
【基本要求】 
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;
若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。
*/ 


#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 1

typedef int status ;

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

typedef struct
{ 
   int car_num;
   int time;
}car_info;

typedef struct
{
   car_info *base;
   car_info *top;
   status stacksize;
}sqstack;

void Initstack(sqstack *s)
{
   s->base=(car_info *)malloc(STACK_INIT_SIZE*sizeof(car_info));
   if(!s->base) exit(OVERFLOW);
   s->top=s->base;
   s->stacksize=0;
}

void push(sqstack *s,car_info e)
{
   *s->top++=e;
   s->stacksize++;
}

car_info pop(sqstack *s)
{
   car_info e;
   if(s->top==s->base){
       printf("停车场内没有该车辆!\n");
       exit(0) ;
       }
   e=*--s->top;
   s->stacksize--;
   return e;
}

typedef struct Qnode
{
   int car_num;
   int time;
   struct Qnode *next;
}QNode,*QueuePtr;

typedef struct
{
   QueuePtr front;
   QueuePtr rear;
   int lenth;
}LinkQueue;

status InitQueue(LinkQueue *Q)
{
   Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
   if(!Q->front)exit(OVERFLOW);
   Q->front->next=NULL;
   Q->lenth=0;
   return OK;
}

void EnQueue(LinkQueue *Q,car_info *a )
{   
   QueuePtr p;
   p=(QueuePtr)malloc(sizeof(QNode));
   if(!p)exit(OVERFLOW);
   p->car_num=a->car_num;
   p->time=a->time;
   p->next=NULL;
   Q->rear->next=p;
   Q->rear=p;
   Q->lenth++;
}

QueuePtr DeQueue(LinkQueue *Q)
{        
   QueuePtr p,e,s={0};
   if(Q->front==Q->rear)
      {printf("便道上没有车辆!\n");
       return s;
       }
   p=Q->front->next;
   e=p;
   Q->front->next=p->next;
   Q->lenth--;
   if(Q->rear==p)Q->front=Q->rear;
    //free(p);
   return e;      
}

void arrive(sqstack *s,LinkQueue *p,car_info a,int n)
{
   if(s->stacksize<n)
    { 
      push(s,a);
      printf("\n车牌号为%d的车辆进入停车场%d号车道\n",a.car_num,s->stacksize);
     }
   else 
    {
      EnQueue(p,&a);
      printf("\n停车场已满,车牌号为%d的车辆停在便道的%d号位置\n",a.car_num,p->lenth);
    }
}

void leave(sqstack *tcc,sqstack *dcc,LinkQueue *p,car_info a,float pay,int n)
{
   car_info x,ss;
   QueuePtr b;
   int find=1,arrivetime=0;
   float cost=0.0;
   while(find)
    {
      ss=pop(tcc);
      push(dcc,ss);
      if(ss.car_num==a.car_num)
       {
         find=0;
         cost=(a.time-ss.time)*pay;
         arrivetime=ss.time;
       }
     }
   pop(dcc); //把临时堆栈的第一辆车(要离开的)去掉;
   while(dcc->stacksize)
    {
      x=pop(dcc);
      push(tcc,x);
    }
   if(tcc->stacksize<n&&p->lenth!=0)
    {
      b=DeQueue(p);
      x.car_num=b->car_num;
      x.time=a.time;
      push(tcc,x);
      printf("车牌号为%d的车辆由便道进入停车场%d号车道\n",x.car_num,tcc->stacksize);
     }
    printf("\n**********************************************\n");
    printf("|车牌号码|进站时刻|出站时刻|停留时间|停车费用|\n");
    printf("|%-6d    |%-6d    |%-6d    |%-6d    |%-6.2f    |\n",a.car_num,arrivetime,a.time,a.time-arrivetime,cost);
    printf("**********************************************\n");
}

int main()
{
   sqstack tcc,dcc;
   LinkQueue p;
   car_info a;
   int sum=1000,n;
   float pay;
   char sign;
   printf("\n|************************停车场管理**************************|\n");
   printf("|******A/a:车辆到达*******D/d:车辆离开******E/e:退出系统*****|\n\n");

   Initstack(&tcc);
   Initstack(&dcc);
   InitQueue(&p);
   printf("请先输入停车场的车位总数,收费标准(元/小时):");
   scanf("%d%f",&n,&pay);
   getchar();
   printf("\n请输入A/D/E,车牌号,时刻:");
   scanf("%c%d%d",&sign,&a.car_num,&a.time);
   getchar();
   while(sum)
    {
     switch(sign)
     {
      case 'a':
      case 'A':arrive(&tcc,&p,a,n);break;
      case 'D':
      case 'd':leave(&tcc,&dcc,&p,a,pay,n);break;
      case 'e':
      case 'E':exit(OVERFLOW);break;
     }
    printf("\n请输入A/D/E,车牌号,时刻:");
    scanf("%c%d%d",&sign,&a.car_num,&a.time);
    getchar();
    sum--;
   }

   getchar();
   getchar();
   return 0;
}
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -