算法和数据结构 停车场的管理 c语言

2025-01-06 03:24:29
推荐回答(2个)
回答1:

C语言数据结构 车队管理

我的结题思路:

车的状态分三种,用switch语句分开{

1:停车     A

库未满,往车库里停车

库满,往便道里停车

2:出车  D

从车库里出车使用临时车库

从变道里出车,使用临时便道

3:停止输入  E

}

注意

1:请勿略下面代码中  “还没有计算位置”   写的时候提醒自己,上传时我忘删了

2:使用静态数组来记录进去的时间 ,用      a[车牌号]

3:用静态   i   来记录进车库里的进出车 

进车  i++

出车  i--

4:在写最关键部分时,我是用到了才定义,所以看着有乱,包含哈-_-    -_-

二、关键代码           //我用的是VS2013
#include 
#include
#include
 
using namespace std;
static int i = 1;
 
static int a[100];
#define STACK_INITSIZE 100
#define StackIncrement 10
#define OK                1
#define ERROR        0
 
 
 
//结构体..............................................................................
typedef struct GARAGE{//创建车库的结构体
       int *base;
       int *top;
       int stacksize;
       int OutTime;
}Garage;
 
typedef struct TPGarage{//创建临时车库的结构体
       int *base;
       int *top;
       int stacksize;
}TpGarage;
 
 
typedef struct QNode{
       int date;
       struct QNode *next;
}QNode, *QueuePtr;
typedef struct{//创建便道的结构体
       QueuePtr front;
       QueuePtr rear;
}OtGarage;
 
typedef struct TNode{//创建临时便道的结构体
       int Tdate;
       struct TNode *Tnext;
}TNode, *TQueuePtr;
typedef struct{
       TQueuePtr Tfront;
       TQueuePtr Trear;
}TOtGarage;
//.....................................................机构体..................
//...........................................声明........................
void InitGarage(Garage &S, int t);//车库
void PushGarage(Garage &S, int chp, int t);
void ZPushGarage(Garage &S, int chp);
void GetTopGarage(TOtGarage &TG, OtGarage &OG, TpGarage &T, Garage &S, int chp, int t);
 
 
int Pop(Garage &S, int &GH);
 
void InitTpStack(TpGarage &T);    //临时车库
void PushTpStack(TpGarage &T, int chp);
void PopTpStack(TpGarage &T, int  &chp);
 
 
void InitOtGarage(OtGarage &OG);//变道
void PushTpStack(TpGarage &T, int chp);
int OutOtGarage(OtGarage &OG, int &e);
 
 
void InitTOtGarage(TOtGarage &TG);//临时便道
void TEnOtGarage(TOtGarage &TG, int &Te);
int TOutOtGarage(TOtGarage &TG, int &Te);
 
int tranverse(Garage S, int t);//遍历车库
int Push(char X, int chp, int t, Garage &S, TpGarage &T, OtGarage &OG, TOtGarage &TG);//枢纽
//............................................声明 .......................................
//.................................车库........................................................
 
 
void InitGarage(Garage &S, int t){//初始化出库
       S.stacksize = t;
       S.base = (int *)malloc(S.stacksize*sizeof(int));
       S.top = S.base;
 
}
 
 
void PushGarage(Garage &S, int chp, int t){//车库进车
       a[chp] = t;     //记录当前的时间
       *(S.top)++ = chp;
}
void ZPushGarage(Garage &S, int chp){//车库进车
       *(S.top) = chp;
       S.top++;
}
void GetTopGarage(TOtGarage &TG, OtGarage &OG, TpGarage &T, Garage &S, int chp, int t){//车库中出
       int keepch = chp;//将当前的车牌保存下来
       int gh = 0;
       int num;
       int fh = 0;
       int i = 0; //记住车库出去车的量
       int e = 0;//做一个遍历,找出该车的位置
       int js = 0;
       int Te = 0;
       S.OutTime = t; //是的话,直接出车,删掉元素
       if (tranverse(S, chp)){//做一个遍历,该车在车库的话,就从车库中出车
                                         
              while (Pop(S, gh) != keepch){      //让车库的车出去
                     PushTpStack(T, gh);
                     i++;
              }
 
              if (num = (S.OutTime - a[chp]) % 10 == 0){
                     num = S.OutTime - a[chp];
              }
              else num = ((S.OutTime - a[chp]) / 10 + 1) * 10;
              cout << "该车在停车场的时间为" << num <                     "分钟,应该收费为" << 0.5*num << "元" << endl;
 
              for (size_t j = 0; j < i; j++){
                     PopTpStack(T, fh);//依次将其他开回来,往前挪一位,空出门前的车位
                     ZPushGarage(S, fh);
              }
              if (OutOtGarage(OG, e)) {//当变道里有车时,从外面再进来一辆车
                     PushGarage(S, e, S.OutTime);
              }
       }
       else{//注意第一个   if,这里是对应的else,表示车要从临时便道里出车
                 //将便道里的车送到临时便道,
              int y = OutOtGarage(OG, gh);
              while (gh != keepch) {      //让车库的车出去 OutOtGarage(OtGarage &OG, int &e)
                     TEnOtGarage(TG, gh); //推到临时车道
                     js++;
                     y = OutOtGarage(OG, gh);
              }
              if (js == 0){   //后面的车往前开
                     //直接从停车场出去
                     cout <<"该车未在车库停车,无需缴费" << endl;
              }
              else if (!OutOtGarage(OG, e)){//如果此时为底的话,再重新进入变道
                     for (size_t j = 0; j < i; j++){
                            int v;
                            v = TOutOtGarage(TG, Te);         //
                            PushTpStack(T, Te);               //还没有计算位置
                     }i--;
                     cout << "该车未在车库停车,无需缴费" << endl;
              }
              else {
                     cout << "该车未在车库停车,无需缴费" << endl;
                     int jd;
                     QueuePtr p;                 //变道有车的话,返回一个
                     p = OG.front->next;
                     e = p->date;
                     OG.front->next = p->next;
                     if (OG.rear == p)
                            OG.rear = OG.front;
                     free(p);
                                             //先释放一个节点,继续传
                     
                            while (OutOtGarage(OG, gh)){      //让车库的车出去 OutOtGarage(OtGarage &OG, int &e)
                                   TEnOtGarage(TG, gh); //推到临时车道
                                   }
                            while (TOutOtGarage(TG, Te)){
                                   PushTpStack(T, Te);
                            }i--;
                     
              }            //如果此时不为底的话,继续进入临时便道,再进入变道
 
       }
}
 
int Pop(Garage &S, int &GH){       //车库中出车
       GH = *--S.top;
       return GH;
 
}
//....................................车库.........................
 
//...............................临时车库..........................
void InitTpStack(TpGarage &T){//初始化临时车库
       T.stacksize = STACK_INITSIZE;
       T.base = (int *)malloc(T.stacksize*sizeof(int));
       T.top = T.base;
}
void PushTpStack(TpGarage &T, int chp){
       if (T.top - T.base >= T.stacksize){
              T.base = (int *)realloc(T.base,
                     (T.stacksize + STACK_INITSIZE)*sizeof(int));
              T.top = T.base + T.stacksize;
              T.stacksize += STACK_INITSIZE;
       }
       *T.top++ = chp;
}
 
void PopTpStack(TpGarage &T, int  &chp){           //当其为返回值为1的时候,删除栈顶且返回
       chp = *--T.top;
}
 
 
 
 
 
//...........................临时车库.................................
//...........................变道....................................
 
void InitOtGarage(OtGarage &OG){//初始化便道
       OG.front = OG.rear = (QueuePtr)malloc(sizeof(QNode));
       OG.front->next = NULL;
}
 
void EnOtGarage(OtGarage &OG, int &e){//进入变道
       QueuePtr p;
       p = (QueuePtr)malloc(sizeof(QNode));//用来放置车牌号
       p->date = e;
       p->next = NULL;
       OG.rear->next = p;
       OG.rear = p;
       cout << "车库已满,该车在变道上的第 " << i << " 位" << endl;
       i++;
       cout << endl;
}
 
 
int OutOtGarage(OtGarage &OG, int &e){//变道 出车
       cout << endl;//没有车的话,返回 0
       
       if (OG.front == OG.rear){
              return ERROR;
 
       }
 
 
       QueuePtr p;                 //变道有车的话,返回一个
       p = OG.front->next;
       e = p->date;
       OG.front->next = p->next;
       if (OG.rear == p)
              OG.rear = OG.front;
       free(p);
       i--;
       return OK;
}
 
void InitTOtGarage(TOtGarage &TG){//初始化便道
       TG.Tfront = TG.Trear = (TQueuePtr)malloc(sizeof(TNode));
       TG.Tfront->Tnext = NULL;
}
void TEnOtGarage(TOtGarage &TG, int &Te){//进入临时变道
       TQueuePtr p;
       p = (TQueuePtr)malloc(sizeof(TNode));//用来放置车牌号
       p->Tdate = Te;
       p->Tnext = NULL;
       TG.Trear->Tnext = p;
       TG.Trear = p;
       //cout << "车库已满,该车在变道上的第 " << i << " 位" << endl;
       i++;
       cout << endl;
}
int TOutOtGarage(TOtGarage &TG, int &Te){//临时变道 出车
       cout << endl;//没有车的话,返回 0
       if (TG.Tfront == TG.Trear)
              return ERROR;
 
       TQueuePtr p;                 //临时变道有车的话,返回一个
       p = TG.Tfront->Tnext;
       Te = p->Tdate;
       TG.Tfront->Tnext = p->Tnext;
       if (TG.Trear == p)
              TG.Trear = TG.Tfront;
       free(p);
       i--;
       return OK;
}
//........................................临时便道...........................
//............................总枢纽...........................................
 
 
int Push(char X, int chp, int t, Garage &S, TpGarage &T, OtGarage &OG, TOtGarage &TG){
       switch (X){//判断该车是进入还是要离开
 
       case 'A':{//情况A,进入车库
              if (S.top - S.base >= S.stacksize){
                     cout << "时间在第" << t << "分钟, " << "车牌号为" << chp << "的小车进入便道等待车位" << endl;
                     //车库满,接下来该车进入便道
                     EnOtGarage(OG, chp);//调用进入变道的函数
              }
              else{
                     //cout << "OOOOO" << endl;
                     PushGarage(S, chp, t);//进入车库
              }
              return OK;
       }break;
 
       case 'D':{//情况D,离开车库
              GetTopGarage(TG, OG, T, S, chp, t);//1:在车库中的出去
              return OK;
       }break;
 
 
       case 'E':{//情况E,所有的车辆弄干净
              return ERROR;
       }break;
 
       }
}
int tranverse(Garage S, int t){
 
       while (S.top != S.base){
              S.top--;
              if (t == *S.top)
                     return OK;
       }
       return ERROR;
 
}
 
int main(){
       int num;
       char X;
       int time;
       int chp;
       int x;
 
       Garage S;
       TpGarage T;
       OtGarage OG;
       TOtGarage TG;
       cout << "温馨提示: 本停车场每10分钟收费0.5元,不足10分钟的部分按10分钟收费。" << endl;
       cout << "请输入停车车位的总数: ";
       cin >> num;
 
       cout << endl;
       InitGarage(S, num);
       InitTpStack(T);
       InitOtGarage(OG);
       InitTOtGarage(TG);
       cout << "输入停止的标志为(E 0 0)" << endl;
       cout << "停车信息 (格式 : (动作,车牌号,时间)) :" << endl;
 
 
 
       do{
              cout << "请输入停车信息 " << endl;
              cin >> X >> chp >> time;
              x = Push(X, chp, time, S, T, OG, TG);
       } while (x);
 
}

回答2:

#include
#define n 2 //分配栈的存储空间
using namespace std;
typedef struct Elem
{//定义元素数据结构类型
int carnum;
int time;
}Elem;
/**************************************/
typedef struct QNode
{//队列
struct QNode *next;
Elem Qelem;
}QNode,*QueuePtr;
/**************************************/
typedef struct
{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;
/*************************************/
void initqueue(LinkQueue &Q)
{//构造一个空队列
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
Q.front->next=Q.rear->next=NULL;
}
/*************************************/
void enqueue(LinkQueue &Q,int carnum,int time)
{//入队操作
QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
p->Qelem.carnum=carnum;
p->Qelem.time=time;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
/*************************************/
void dequeue(LinkQueue &Q,Elem &e)
{//从对头离队操作,并返回其值
QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
if(Q.front!=Q.rear)
{
p=Q.front->next;
e=p->Qelem;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
}
}
/*************************************/
int main()
{
char c;
int carnum,time,i,j=0,k=0;
LinkQueue Q;
QueuePtr p,r;
initqueue (Q);
Elem e,selem[n]/*,Qelem*/;//数组化栈内数据元素
int base=0,top=0;
cout<<"请输入数据:"< while(cin>>c>>carnum>>time)
{

if(c=='A')//到达
{
if(j!=0)//第一次不用查找车牌号,时间是否合法
{
for(i=0;i {
if(selem[i].carnum==carnum) {cout<<"该车号已存在!"< if(selem[i].time>=time) {cout<<"输入时间有误!"< }
if(k==0&&Q.front!=Q.rear)//从队列中查找
{
if(Q.rear->Qelem.time>time) {cout<<"输入时间有误!"< r=Q.front->next;
while(r&&r->Qelem.carnum!=carnum)
{r=r->next;}
if(r&&r->Qelem.carnum==carnum) {cout<<"该车号已存在!"< }
}
////////////////////
if(k==0)
{
if(top {
selem[top].carnum=carnum;
selem[top].time=time;
top++;
cout<<"请进入停车场"< }
else
{
enqueue(Q,carnum,time);
cout<<"请便车道稍等!"< }
}
j++;
}//到达
else if(c=='D')//离开
{
int ture=0;
for(i=0;i {
if(selem[i].carnum==carnum) break;
}
if(selem[i].carnum==carnum)
{
ture=1;
cout<<"您的停车时间为"< while(i!=top)//填补栈
{
selem[i]=selem[i+1];
i++;
}
top--;
if(Q.front!=Q.rear)
{
dequeue(Q,e);//离队,并返回数据e
selem[top].carnum=e.carnum;
selem[top].time=time;
top++;
cout< }
}//从停车场离开
else if(Q.front!=Q.rear)//从队列中查找,直接离开
{
p=Q.front;r=Q.front->next;
while(r&&r->Qelem.carnum!=carnum)
{
p=r;r=r->next;
}
if(r&&r->Qelem.carnum==carnum)
ture=1;
while(ture&&r&&r->Qelem.carnum!=carnum)
{
Q.front->next=r->next;
r->next=Q.rear->next;
Q.rear->next=r;
Q.rear=r;
r=Q.front->next;
}
if(r&&r->Qelem.carnum==carnum)
{
ture=1;
cout<<"便道"<Qelem.carnum<<"号车离开,不收取费用!"< p->next=r->next;
}
}//直接从队列离开
if(ture==0)
cout<<"没有该辆车!"< }
else if(c=='E')
{
cout<<"输入结束!"< break;
}
}
return 0;
}