队列和栈的应用 ------ 停车场

停车场问题

#include<stdio.h>
#include<stdlib.h>
#define STACKSIZE 3
#define MAXSIZE 100
int n; 
typedef struct data{
    int num;
    int time;
}Data;
typedef struct SeqStack             //栈的储存结构 
{
    Data data[STACKSIZE];
    int top;
}SeqStack;

typedef struct                      //队列的储存结构 
{
    Data data[MAXSIZE];
    int rear;
    int front; 
 }CirQueue; 

// void InitQueue(CirQueue &Q)              //初始化队列 
// {
//  Q.front=Q.rear=0;
// }
// 
// int Queue(CirQueue &Q,Data x)                //将X入队列
// {
//  if((Q.rear+1)%MAXSIZE==Q.front)
//  return 0;                                //队列已满
//   else{
//      Q.data[Q.rear]=x;
//       Q.rear=(Q.rear+1)%MAXSIZE;         //重新设置队尾指针
//       return 1; 
//   } 
//  } 
循环队列出队操作
//int DelQueue(CirQueue &Q,Data &x)
//{
//  if(Q.front==Q.rear)
//  return 0;x=Q.data[Q.front];
//  Q.front=(Q.front+1)%MAXSIZE;    //重新设置队头指针 
//  return 1;    
// } 
//初始化栈  
void InitQueue(CirQueue &Q){
    Q.front=Q.rear=0;
}

bool InQueue(CirQueue &Q,Data x){
    if((Q.rear+1)%MAXSIZE==Q.front) //队列满了
        return false;
        Q.data[Q.rear]=x;
        Q.rear=(Q.rear+1)%MAXSIZE;
        return true; 
}

bool DelQueue(CirQueue &Q,Data &x)
{
    if(Q.front==Q.rear)
    return false;
    x=Q.data[Q.front];
    Q.front=(Q.front+1)%MAXSIZE;
    return true;
}

void InitStack(SeqStack &S)
{
    S.top=-1;
 } 
bool StackEmpty(SeqStack &S)
{
    return S.top==-1?true:false; 
}
//判断栈满
int StackFull(SeqStack &S)
{
    return S.top==n-1?true:false;
 } 
 //进栈操作(将x放入栈中)
bool Push(SeqStack &S,Data x)
{
    if(S.top==STACKSIZE-1)
    return false;
    else 
    {
        S.top++;
        S.data[S.top]=x;
        return true;
     } 
 } 

 //出栈操作 
 bool Pop(SeqStack &S,Data &x)
 {
    if(S.top==-1)
    return false;
    else
    {
        x=S.data[S.top];
        S.top--;
        return true;
     }
  } 
//取栈顶元素,放入X中储存。 
bool GetTop(SeqStack &S,Data &x)
{
    if(S.top==-1) 
    {
        return false;
    }
        else
        {
            x=S.data[S.top];
            return true;
        }
    }
 bool selectInStack(SeqStack &S,int num){   //查找是否在栈中 
    bool flag=false;
    for(int i=0;i<=S.top;i++){
        if(S.data[i].num==num){
            flag=true;
         }
     }
     return flag;
 }
 bool selectInQueue(CirQueue &S,int num)
 {
    bool flag=false;
//  for(int i=S.front;i<=S.rear;i++){
//      if(S.data[i].num==num){
//          flag=true;
//       }
//   }(Q.rear+1)%MAXSIZE==Q.front
    int a=S.front,b=S.rear;
    while(a!=b){
        if(S.data[a].num==num){
            flag=true;
        }
        a=(a+1)%MAXSIZE;
    }
     return flag;
  } 
  void moveStack(SeqStack &S,CirQueue &Q,int num,Data &b){      
    SeqStack  carStandby;       //备用栈,用来让汽车出去 
    InitStack(carStandby);
  //    Data S1;
    int i,j,k;
    for(i=0;i<=S.top;i++){
        if(S.data[i].num==num){
            b=S.data[i];                //存储出栈元素的数据 
            k=i;                        //存一下取出元素的位置 
            break;
         }
     }
     Data S2;
     for(j=S.top;j>k;j--){
        Pop(S,S2);
        Push(carStandby,S2);
     }
        Pop(S,S2);
        for(i=k;!StackEmpty(carStandby);i++){
            Pop(carStandby,S.data[i]);
            S.top++;
        }
//      while(!StackEmpty(carStandby)){
//              Pop(carStandby,S2);
//              Push(carStandby,S2);    
//      }
        if(Q.front!=Q.rear){                    //若队列不空则队列的头子出队 
            DelQueue(Q,S2);
            Push(S,S2);
        } 

  } 
int main()
{
    int price,carNum,carTime;
    bool flag=true;
    char state;
    SeqStack  carParking;
    CirQueue  waitingSet;       //停车队列  
    InitQueue(waitingSet);  
    InitStack(carParking);

    printf("请输入停车场最大可容纳汽车,以及库存的汽车每小时的费用(小时/元)\n"); 
    scanf("%d%d",&n,&price);
    printf("请输入车的状态(A进/D出/E结束),车牌号和时间(进站时间/出站时间)\n");

    while(flag){
        getchar();
        scanf("%c",&state);
        getchar();
        scanf("%d%d",&carNum,&carTime);
    Data information;
    information.num=carNum; information.time=carTime;
    switch(state){

            case 'A':{
                if(StackFull(carParking)){              //若停车场栈满,则在外面排队 
                    if(InQueue(waitingSet,information))
                        printf("车牌号为 %d 的车在便道的位置是%d\n",information.num,waitingSet.rear-waitingSet.front);
                        else printf("停车场外队列已满\n");
                }else {
                    if(Push(carParking,information)){
                        printf("车牌号是 %d 的车在停车场的位置是 %d \n",information.num,carParking.top+1);
                    }
                }
                break;
            }

                case 'D':{                                                      //出栈或者出队,判断元素是在栈中还是在队列中,若栈在,队列在,出栈则出队1进栈1,
                    if(selectInQueue(waitingSet,information.num)){
                        Data info;
                        DelQueue(waitingSet,info);
                        printf("在停车道候车等待的车 %d ,等得不耐烦回去了,并不收钱\n",info.num);

                    }else if(selectInStack(carParking,information.num)){
                        //取出元素,比并栈递推进入 
                        int time,money,a;
                        Data b;
                        moveStack(carParking,waitingSet,information.num,b);
                        printf("车牌号是%d的车在停车场停留的时间是 %d 小时,共花费了 %d 元\n",b.num,information.time-b.time,(information.time-b.time)*price);
                    }else{
                        printf("无此车辆\n");
                    }

                    break;
                }
                case 'E':{
                        flag=false;
                        printf("输入结束...");
                    break;
                }

                    default: printf("输入错误,请重新输入\n");break;
    }
    }

 } 


写的不是很好,多多见谅。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
问题描述:利用堆队列实现一个停车场管理系统 基本要求: 设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆次序。编制一程序模拟该停车场的管理。车辆的信息包括:车牌号、汽车到达/离去标志、到达/离去时刻等。按照从终端读入的数据序列进行模拟管理。每辆车需要三个数据,其中车辆数据为:A表示到达,D表示离去,E表示程序结束。车辆牌照为整型数据。进场或离场时间同样为整型数据。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。 停车场管理系统主要实现以下几个功能: (1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。 (2)该程序设计能够通过车牌号能查到该车辆在停车场或便道中的位置。 (3)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。实现停车场的调度功能。 [测试数据] (A,1,1) (A,2,2) (A,3,3) (A,4,4) (A,5,5) (D,2,7) (A,1,8) (A,4,9)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值