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

📄 park.c

📁 c语言一些基础编码
💻 C
字号:
/* 标准文档模板 */

#include "Stdio.h"
#include "Conio.h"


/* 停车场管理的简单模拟 */
#define N  4     /* 停车场容量 */
#define M  5     /* 收费单价/单位时间 */
#define True  1
#define False 0
#define Null  0
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

typedef struct element
  {
  int num;
  int arrtime;
  } ElemType;

typedef struct stacktag
  {
   ElemType stack[N];
   int top;
  } STACK;

typedef struct nodetag
 {
  int num;
  struct nodetag *next;
 } QUEUE;

typedef struct queuetag
 {
  QUEUE *front,*rear;

 }LinkedQueTp;

void IniStack(STACK *s);
int  Push(STACK *s,ElemType x);
ElemType Pop(STACK *s);
void IniLinkedQue(LinkedQueTp *s);
void EnLinkedQue(LinkedQueTp *s,int num1);
int  DeLinkedQue(LinkedQueTp *s);
void Arrive(STACK *s1,LinkedQueTp *p,ElemType x);
void Delive(STACK *s1,STACK *s2,LinkedQueTp *p,ElemType x);

void IniStack(STACK *s)
{
 s->top=-1;
 return;
}

int Push(STACK *s,ElemType x)
 {
  int mytop;
  if(s->top==N-1)
   {
    printf("\nStack Overflow!\n");
    return (False);
   }
  else
   {
    mytop=s->top;
    mytop++;
    s->stack[mytop]=x;
    s->top=mytop;
    return (True);
   }
 }

/* Initialize Stack */

ElemType Pop(STACK *s)
{
 ElemType x;
 int i;
 if(s->top<0)
 {
  x.num=Null;
  x.arrtime=Null;
  return (x);
 }
 else
 {
  s->top--;
  i=s->top+1;
  x=s->stack[i];
  return x;
 }
}

/* Pop */


void IniLinkedQue(LinkedQueTp *s)
{
  QUEUE *p1;
  s->front=(QUEUE *)malloc(sizeof(QUEUE));
  s->rear=s->front;
  p1=s->front;
  p1->next=Null;
  p1->num=0;
}

/* IniLinkedQue */

void EnLinkedQue(LinkedQueTp *s,int num1) /* 数据入队列(链接式循环队列) */
{
 QUEUE *p,*p1;
 p=(QUEUE *)malloc(sizeof(QUEUE)); /* 产生一个新节点 */
 p->num=num1;
 p->next=Null;
 p1=s->rear;         /* 加入队尾 */
 p1->next=p;
 s->rear=p;
 p1=s->front;
 p1->num++;
}

/* EnLinkedQue */

int DeLinkedQue(LinkedQueTp *s) /* 数据节点出队列 */
{
 QUEUE *p;
 int n;
 if(s->front==s->rear) return (Null);
 else
 {
  p=s->front->next;
  s->front->next=p->next;
  if(p->next==Null)
   s->rear=s->front;
  n=p->num;
  free(p);
  s->front->num--;
  return (n);
 }
}

/* DeLinkedQue */

void Arrive(STACK *s1,LinkedQueTp *p,ElemType x)
/* 车辆到达处理  */
{
  int f,no1,no2;
  f=Push(s1,x); /*  新到车辆进入停车场栈      */
  if(f==False)  /*  如停车场满, 就进入便道队列等待 */
  {
    EnLinkedQue(p,x.num);
    no1=p->front->num;
    printf("第%d号车停在便道的第%d号车位上\n",x.num,no1);
   }
  else /* 新到车辆进入停车场 */
  {
   no1=s1->top+1;
   no2=x.num;
   printf("第%d号车停在停车场的第%d号车位上\n",no2,no1);
  }
}
/* Arrive */

void Delive(STACK *s1,STACK *s2,LinkedQueTp *p,ElemType x)
/* 离开处理 */
{
  int n,f=False;
  ElemType y;
  QUEUE *q;
  while((s1->top>-1) && (f!=True)) /* 在停车场中寻找要离开的车辆 */
  {
   y=Pop(s1);
   if(y.num!=x.num) /* 如果栈顶元素不是要离开的车辆,就将其放如车辆规闭所*/
      n=Push(s2,y);
   else f=True;
  }
 if(y.num==x.num) /*在停车场中找到要离开的车辆*/
  {
   printf("第%d号车应收费%d元",y.num,(x.arrtime-y.arrtime)*M);
   while(s2->top>-1)
   {
    y=Pop(s2);
    f=Push(s1,y);
   }
  n=DeLinkedQue(p);
 if(n!=Null) /* 有车在队列中等待 */
  {
   y.num=n;
   y.arrtime=x.arrtime;
   f=Push(s1,y);
   printf("第%d号车停在停车场第%d号车位上\n",y.num,s1->top+1);
  }
 }
 else/*在停车场中没有找到要离开的车辆*/
 {
 while(s2->top>-1)
 {
  y=Pop(s2);
  f=Push(s1,y);
 }
 q=p->front; /* 指向队头 */
 f=False;
 while(f==False && q->next !=Null) /*在便道上寻找要离开的车辆*/
  if(q->next->num!=x.num)
    q=q->next;
  else
  {
   q->next=q->next->next; /*在便道上找到该车辆*/
   p->front->num--;
   if(q->next==Null)
     p->rear=p->front;
   printf("第%d号车离开便道\n",x.num);/*该车离开便道,但不收费*/
   f=True;
  }
  if(f==False)
  printf("输入数据错误,停车场和便道上均无第%d号车\n",x.num);
 }
}

void main()/* 停车场模拟管理程序 */
{
 char ch1,ch2;
 STACK *s1,*s2;
 LinkedQueTp *p;
 ElemType x;
 int flag,t1,t2;
 s1=(STACK *)malloc(sizeof(STACK));
 s2=(STACK *)malloc(sizeof(STACK));
 p=(LinkedQueTp *)malloc(sizeof(LinkedQueTp));
 IniStack(s1);  /* 初始化停车场栈 */
 IniStack(s2);  /* 初始化车辆规避所栈 */
 IniLinkedQue(p);/* 初始化便道队列 */
 flag=True;
 for(;;)
 {


  printf("\n输入数据:'A'/'D',车牌号,到达时间/离开时间\n");
  printf("E---退出。\n");
  scanf("%c,%d,%d",&ch1,&t1,&t2);
  x.num=t1;
  x.arrtime=t2;
  ch2=getchar();
  switch(ch1)
  {
   case 'a':
   case 'A': Arrive(s1,p,x);
         printf("\nPress any key to continue...\n");
         getch();
         break;
   case 'd':
   case 'D': Delive(s1,s2,p,x);
         printf("\nPress any key to continue...\n");
         getch();
         break;
   case 'e':
   case 'E': flag=False;
         printf("\n程序正常结束\n");
         break;
   default:  printf("\n输入数据错误,重新输入\n");
         printf("\nPress any key to continue...\n");
         getch();
         break;
   }
  if(flag==False) break;
  }
  return;
 } 

⌨️ 快捷键说明

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