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

📄 tingchechang.cpp

📁 内含有两个停车场管理的源文件
💻 CPP
字号:
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#define PERHOUR 10
#define N 100
#define OK 1
#define OVERFLOW -2
#define ERROR  0
#define CARNUM 2
typedef int ElemType;
typedef int Status;
struct{
   int number;
   int time;
   int flag;
   }car[N];
typedef struct{
    ElemType *base;
    ElemType *top;
    int stacksize;
   }Stack;/* 构造两个栈,一个为模拟停车场的栈,一个为辅助栈 */
typedef struct QNode{
    ElemType data;
    struct QNode *next;
   }QNode,*QueuePtr;
typedef struct{
  QueuePtr front;
  QueuePtr rear;
  }LinkQueue;/* 构造一个队列模拟车场外的便道 */
Stack ZS;/* 定义栈ZS */
Stack VS;/* 定义栈VS */
LinkQueue Q;/* 定义队列Q */
QueuePtr p;
int a,b,c,i=0,r;
ElemType e;
int InitStack(Stack *S);
int InitQueue(LinkQueue *Q);
int GetTop(Stack S,ElemType *e);
int Push(Stack *S,ElemType e);
int Pop(Stack *S,ElemType *e);
int EnQueue(LinkQueue *Q,ElemType e);
int DeQueue(LinkQueue *Q,ElemType *e);
void Exchange(ElemType e);
int In(ElemType e);
int In1(ElemType e);
int InitStack(Stack *S){
   S->base=(ElemType*)malloc(CARNUM*sizeof(ElemType));
   if(!S->base) exit(OVERFLOW);
   S->top=S->base;
   S->stacksize=CARNUM;
   return OK;
   }//构造栈
int InitQueue(LinkQueue *Q){
  Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
  if(!Q->front) exit(OVERFLOW);
  Q->front->next=NULL;
  return OK;
  }/* 构造一个模拟场外便道的队列 */
int GetTop(Stack S,ElemType *e){
    if(S.top==S.base) {
        *e=0;
        return ERROR;}
    *e=*(S.top-1);
    return(*e);
  }  /*GetTop*/
int Push(Stack *S,ElemType e){
  if((S->top-S->base)>=CARNUM)
    EnQueue(&Q,e);  /* 栈满,后来的车去便道等候 */
  else
  *S->top++=e;
  return OK;
  }/* 一辆车入停车场 */
int Pop(Stack *S,ElemType *e){
  if(S->top==S->base) return ERROR;
  *e=*--S->top;
  return OK;
  }/* 一辆车出停车场 */
int EnQueue(LinkQueue *Q,ElemType e){
  p=(QueuePtr)malloc(sizeof(QNode));
  if(!p) exit(OVERFLOW);
  p->data=e;
  p->next=NULL;
  Q->rear->next=p;
  Q->rear=p;
  printf("车牌号为%d的车进入了便道\n",b);
  return OK;
  }/* 当停车场满后入的车进便道 */
int DeQueue(LinkQueue *Q,ElemType *e){
  int j;
  if(Q->front==Q->rear) return ERROR;
  p=Q->front->next;
  *e=p->data;
  Q->front->next=p->next;
  if(Q->rear==p) Q->rear=Q->front;
  free(p);
  j=*e;
  printf("车牌号为%d的车退出了便道进入车场\n",j);
  return(OK);
  }/* 当停车场有一辆车出栈时便道的一辆车进停车场 */

void Exchange(ElemType e){
  int money;
  while(In(e)){
   Pop(&ZS,&e);/* ZS的栈顶车出栈 */
   Push(&VS,e);/* 从ZS出栈的车进VS */
   }/* while */
   Pop(&ZS,&e);/* 第b辆车开出停车场 */
   for(r=0;r<i;r++){
   if(b==car[r].number && car[r].flag==0)
   {
   money=c-car[r].time;
   money=money*PERHOUR;
   car[r].flag=1;
   printf("你的停车费用是:%d元,欢迎下次再来.祝你一路顺风\n",money);printf("\n");}
   }/* 出栈时计算出要付的钱 */
   while(In1(e)){
    Pop(&VS,&e);
    Push(&ZS,e);
    }/* 进入辅助栈的车开回停车场 */
    if(Q.front!=Q.rear)
    {DeQueue(&Q,&e);
    Push(&ZS,e);}/* 从便道上的对头车进入停车场 */
   }
int In(ElemType e){
 GetTop(ZS,&e);
 if(e==b)
 return 0;
 else
 return OK;
 }/* 判断出栈的车是否在盏顶 */
int In1(ElemType e){
 GetTop(VS,&e);
 if(e==0) return 0;
 else
 return OK;
 }
 main()
{
   InitStack(&ZS); /* 构造一个模拟停车场的空栈ZS */
   InitStack(&VS); /* 构造一个空的辅助栈VS */
   InitQueue(&Q);  /* 构造一个模拟场外便道的队列 */
   printf("*-*-*-*-*欢迎来到停车场管理系统*-*-*-*-*\n");
   printf("\n");
   printf("本停车场收费标准是每小时10元,在便道上不收费用\n");
   printf("\n");
   printf("------请按提示操作--------\n");
   printf("\n");
   printf("A.到达,车牌号登记,到达时间\nD.离去,要离去车的车牌号,离去时间\nE.输入结束\n");
   printf("\n");
   printf("请按顺序输入操作先输入要进入还是离开停车场,然后是车牌号码,最后是进入离开时间\n");
   printf("\n");
   printf("例如: 5时刻进入一号车到停车场: A,1,5\n");
   while(1){
     printf("-------请输入你要的操作-----------\n");
     scanf("%c,%d,%d",&a,&b,&c);
     getchar();//接收回车键
     car[i].number=b;
     car[i].time=c;
     car[i].flag=0;//在队列时的车辆作标析,为了在便道上不收费
     if(a=='E') break;/* 选择E则退出操作 */
     if(a=='A') {
         printf("你的操作是车牌号为%d的车在%d时刻进入停车场\n",b,c);
         Push(&ZS,b);}/* 选择A则停车 */
     if(a=='D') {
         printf("你的操作是车牌号为%d的车在%d时刻离开停车场\n",b,c);printf("\n");
         Exchange(e);car[i].flag=1;}/* 选择D则离开停车场 */
       i++;
   }
  }/* main()函数结束 */

⌨️ 快捷键说明

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