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

来源:互联网 发布:部落冲突vb.67.9破解版 编辑:程序博客网 时间:2024/05/18 02:23

停车场问题

#include<stdio.h>#include<stdlib.h>#define STACKSIZE 3#define MAXSIZE 100int 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 0