您的位置:首页 > 其它

关于“停车场问题”所做的总结

2015-11-03 23:49 267 查看
数据结构第二次上机作业。“停车场问题”

 主要考察问题:

      栈:

        初始化栈

        判断栈满

        入栈

        出栈

      队列:

        初始化链队列

        判断链队列是否为空

        链队列入队

        链队列出队

总结细节问题:


   string函数只能在C++函数中使用;

   [b]使用时要包含头文件#include<iostream> [/b]

[b]            #include<string>[/b]

[b]   要使用栈或者队列,用之前必须初始化栈或者队列;[/b]

[b]   在定义一个指针时,必须给他一个空间;[/b]

以下是源代码:

#include <stdio.h>
#include <malloc.h>
#include <string>
#include <iostream>

using namespace std;

#define MAX 2
#define TRUE 1
#define FALSE 0

/******************************************/
/************** 结构体定义 ****************/
/******************************************/

typedef struct          //车辆信息结构体
{
string number;         //车牌号码
int time;            //到达时刻
}Car;

typedef struct                   //顺序栈定义
{
Car elem[MAX];      //车辆信息结构体指针       //////////////
int top;
}SeqStack;

typedef struct Node        //链队列定义
{
Car data;             //车辆信息域
struct Node *Next;       //指针域
}LinkQueueNode;

typedef struct
{
LinkQueueNode *front;
LinkQueueNode *rear;
}LinkQueue;

SeqStack garage;//车库
SeqStack quit;//暂退车道
LinkQueue thendrive;//便车道

/**********************************************/
/***************** 函数声明 *******************/
/**********************************************/

void InitStack(SeqStack *s);//初始化顺序栈
int IsEmpty(SeqStack *s);//判断栈满函数
int Push(SeqStack *s,int e);//入栈
int Pop(SeqStack *s,int *e);//出栈

void InitStack(SeqStack *s)
{
s->top=-1;
}

int IsEmpty(SeqStack *s)
{
if(s->top==-1)
return TRUE;
else
return FALSE;
}

int Push(SeqStack *s,string number,int time)
{
if(s->top>=2)
return FALSE;
else
{
s->top++;
s->elem[s->top].number=number;
s->elem[s->top].time=time;
}
return TRUE;
}

int Pop(SeqStack *s,Car *e)
{
if(s->top==-1)
return FALSE;
else
{
e->number=s->elem[s->top].number;
e->time=s->elem[s->top].time;
s->top--;
return TRUE;
}
}

int InitQueue(LinkQueue *Q);
int EmptyQueue(LinkQueue Q);
int EnterQueue(LinkQueue *Q,string number,int time);
int DeleteQueue(LinkQueue *Q,Car *x);

int InitQueue(LinkQueue *Q)        //链队列初始化
{
Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(Q->front!=NULL)
{
Q->rear=Q->front;
Q->front->Next=NULL;
return TRUE;
}
else
return FALSE;
}

int EmptyQueue(LinkQueue *Q)     //判断链队列是否为空
{
if(Q->front==Q->rear)
return TRUE;
else
return FALSE;
}

int EnterQueue(LinkQueue *Q,string number,int time)        //链队列入队操作
{
LinkQueueNode *NewNode;
NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(NewNode!=NULL)
{
NewNode->data.number=number;
NewNode->data.time=time;
NewNode->Next=NULL;
Q->rear->Next=NewNode;
Q->rear=NewNode;
return TRUE;
}
else
return FALSE;        //溢出
}

int DeleteQueue(LinkQueue *Q,Car *x)        //链队列出队操作
{
LinkQueueNode *p;
if(Q->front==Q->rear)
return FALSE;
p=Q->front->Next;
Q->front->Next=p->Next;
if(Q->rear==p)
Q->rear=Q->front;
(*x)=p->data;
free(p);
return TRUE;
}

/**********************************************/
void Come(string Number,int Time);//车辆到达函数
void Leave(string Number,int Time);//车辆离开函数

void Come(string Number,int ComeTime)
{
if(garage.top<2)
{
Push(&garage,Number,ComeTime);
}
else
{
EnterQueue(&thendrive,Number,ComeTime);
}
cout<<Number<<"当前停放在车库"<<garage.top+1<<endl;
}

void Leave(string Number,int LeaveTime)
{
Car *e=new(Car);
int cost;//停车费用
while((!IsEmpty(&garage))&&((garage.elem[garage.top].number)!=Number))//当"车库"栈不空,并且栈顶车辆不是要离开的车
{
Pop(&garage,e);//将"车库"栈的栈顶车辆退出
Push(&quit,e->number,e->time);//让退出的车辆进入"暂时退车道"栈
}
Pop(&garage,e);
cost=(LeaveTime-e->time)*5;
//将"暂时退车道"栈中的车辆倒回"车库"栈
while(!IsEmpty(&quit))
{
Pop(&quit,e);
Push(&garage,e->number,e->time);
}
if(!EmptyQueue(&thendrive))
{
DeleteQueue(&thendrive,e);//队头车辆出队
e->number=LeaveTime;
Push(&garage,e->number,e->time);
}
cout<<Number<<"停放时间为"<<LeaveTime-e->time<<"停车费用为"<<cost<<"元"<<endl;
}

void main ()
{
int A;
string Number;
int Time;
InitStack(&garage);
InitStack(&quit);
InitQueue(&thendrive);
printf("请输入车辆信息(到达/离开,牌照号码,当前时刻):");
cin>>A;
while(A!=-1)
{

cin>>Number>>Time;
if(A==1)
{
Come(Number,Time);
}
else
Leave(Number,Time);
cin>>A;
}

}


        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: