我的结题思路:
车的状态分三种,用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);
}
#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<<"请输入数据:"<
{
if(c=='A')//到达
{
if(j!=0)//第一次不用查找车牌号,时间是否合法
{
for(i=0;i
if(selem[i].carnum==carnum) {cout<<"该车号已存在!"<
if(k==0&&Q.front!=Q.rear)//从队列中查找
{
if(Q.rear->Qelem.time>time) {cout<<"输入时间有误!"<
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<<"您的停车时间为"<
{
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<<"便道"<
}
}//直接从队列离开
if(ture==0)
cout<<"没有该辆车!"<
else if(c=='E')
{
cout<<"输入结束!"<
}
}
return 0;
}