停车场管理(C语言版)

      设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北段),若停车厂内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车迹可开入;停车场内某辆车要离开时,在它之后进入的车连必须先退出车厂为它让路,待该车辆开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车时必须按它停留的时间长短缴纳费用。编写按上述要求进行管理的模拟程序。
      可以将停车场定义成一个顺序栈s0,便道定义成一个链队列q,而停车场中的某辆车要离开,则在它后面进停车场的车必须让道,让其离开,所以必须有一个临时的顺序栈s1,存放让道的车辆。
      当有车辆进停车场时,若栈s0不满,则直接进入栈s0;若栈s0满,则进入便道(链队列q)。若有s0中车辆x离开时,先让在x后面进栈的车从s0退栈并进入栈s1中,让x离开并收取停车费(在便道上停留的时间不收费),然后再把s1中所有元素退栈并重新进入s0栈,最后,将链队列q中的队头元素出队并进栈到s0中。

首先设计一个数据结构,在此小程序中用一个字符表示车辆,停放的时间用int类型,按照题目的要求,设计一个队列和栈如下所示。

typedef struct parkingNode{
	dataType car; 
	int time_min;
}parkingNode,*parkingPmt; 
//存放车辆的一个顺序栈
typedef struct{
	parkingNode *base;
	parkingNode *top;
	int length;
}SqStack;

typedef struct QNode{
	dataType data;
	QNode *next;
}QNode,*QueuePtr;
//存放临时车辆的队列
typedef struct{
	QueuePtr front;
	QueuePtr rear;
}LinkQueue; 

完整代码如下:

#include<iostream>
using namespace std;
#include<time.h>
#define MAXSIZE 5
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef char dataType;
typedef int Status;
typedef struct parkingNode{
	dataType car; 
	int time_min;
}parkingNode,*parkingPmt; 
//存放车辆的一个顺序栈
typedef struct{
	parkingNode *base;
	parkingNode *top;
	int length;
}SqStack;

typedef struct QNode{
	dataType data;
	QNode *next;
}QNode,*QueuePtr;
//存放临时车辆的队列
typedef struct{
	QueuePtr front;
	QueuePtr rear;
}LinkQueue; 
//初始化顺序栈(停车场通道和临时车道)
Status initSqStack(SqStack &S){
	S.base = new parkingNode[MAXSIZE];//MAXSIZE为停放车辆的最大数量
	if(!S.base) 
		exit(OVERFLOW);
	S.top=S.base;
	S.length=0;
	return OK;
} 
//初始化链式队列(外面停放的车辆,便道) 
Status initLinkQueue(LinkQueue &L){
	L.front=L.rear=new QNode;
	L.rear->next=NULL;
	L.front->next=NULL;
	return OK;
}
//获取当前时间
int getTime(){
	time_t t;
    struct tm * lt;
    time(&t);//获取Unix时间戳。
    lt = localtime (&t);//转为时间结构。
    return lt->tm_min;
}
//判断是否停满
bool isParkingFull(SqStack S){
	return (S.top-S.base)==MAXSIZE?true:false;
}
//判断停车场是否是空的
bool isParkingEmpty(SqStack S){
	return (S.top==S.base)?true:false;
} 
//判断停车道是否已经有这个车辆
bool isExist(SqStack S,dataType car) {
	parkingNode *p=S.base;
	if(S.base==S.top)
		return 0;
	while(p->car!=car&&p!=S.top){
		p++;
	}
	return p!=S.top;
}
//开始停放车辆
Status parking(SqStack &S,LinkQueue &L,dataType car){
	if(isExist(S,car)){
		cout<<"停车道已经有"<<car<<"这个车辆\n";
		return ERROR;
	}
	if(isParkingFull(S)){//表示停车道此时车已经停满
		if(!L.front)
			initLinkQueue(L);//初始化便道队列
		cout<<"该停车场已经停满,需要借助临时便道!!!"<<endl;
		QueuePtr node=new QNode;
		node->data=car; 
		node->next=NULL;//
		L.rear->next=node;//让车先暂时停放在便道 
		L.rear=node;
	}
	else{
		S.top->car=car;
		S.top->time_min=getTime();
		S.top++;
		S.length++;
	}
	return OK;
}
//便道上目前有几辆车
int side_len(LinkQueue L){
	int length=0;
	QueuePtr p=L.front;
	while(p!=L.rear){
		p=p->next;
		length++;
	}
	return length;
} 
//车辆离开停车场 
Status leaveParking(SqStack &S1,SqStack S2,LinkQueue &L,dataType &car){
	int flag=0,i=0;
		if(isParkingEmpty(S1)){
			cout<<"停车道为空,没有车辆\n";
			return ERROR;
		}
		initSqStack(S2);//初始化临时停放车道 
		parkingNode *temp=S1.top--;
		while(S1.top->car!=car&&S1.top!=S1.base){
			*S2.top++=*S1.top--;
		}
		if(S1.top==S1.base)
			if(S1.top->car!=car)
			{
				cout<<"停车道没有这辆车"<<endl;
				S1.top=temp;
				return ERROR; 
			}
	int t = getTime()-S1.top->time_min;
	cout<<S1.top->car<<"车"<<"已经停了"<<t<<"分钟"<<",需要收费:"<<100*t<<"元\t";
	while(S2.top!=S2.base)
		*S1.top++=*--S2.top;
	S1.length--;
	int len=MAXSIZE-S1.length;//停车道此时的空余位置 
	cout<<"此时停车道有"<<len<<"个空位\n";
	if(side_len(L)>0){//表示便道上目前有停放的车辆 

			QueuePtr p=L.front->next;
			QueuePtr q; 
			while(p!=L.rear&&i<len){
				q=p;
				parking(S1,L,p->data);
				p=p->next;
				L.front->next=p;
				delete q;
					i++;
		}
		if(i<len){
			parking(S1,L,p->data);
			L.rear=L.front;
			delete p;
		}
		cout<<"便道上的车入库完成!!!\n";
	}
	return OK;
}
//遍历停车道车位信息
void print_Stack(SqStack S){
	parkingPmt p=S.base;
	cout<<"车辆信息(停车时间):";
	int t=getTime();
	if(p==S.top)
		return;
	while(p!=S.top){
		cout<<p->car<<"("<<t-p->time_min<<")\t";
		p++;
	}
	cout<<endl<<endl;
} 
//遍历便道车位信息
void print_Queue(LinkQueue L){
	QueuePtr p=L.front;
	cout<<"在便道等待的车辆信息:";
	if(p==L.rear)
		return;
	while(p!=L.rear){
		p=p->next;
		cout<<p->data<<"\t";
	}
	cout<<endl<<endl;
}

int main(){
	int order,flag=1;
	dataType car;
	SqStack S1,S2;
	LinkQueue L;
	L.front=L.rear=NULL;
	initSqStack(S1);
	while(flag){
		cout<<"1.停车(还有"<<MAXSIZE-S1.length<<"个停车位)\n2.出库\n3.查询停车道车位信息\n4.查询便道停车位信息\n";
		cout<<"输入你要进行的操作(输入0退出):";
		cin>>order;
		switch(order){
			case 0:exit(OVERFLOW);
			case 1:
				cout<<"输入你要入库的车的编号(字符):";
				cin>>car;
				parking(S1,L,car);break;
			case 2:
				cout<<"输入你要出库的车的编号(字符):";
				cin>>car;
				leaveParking(S1,S2,L,car);break;
			case 3:
				print_Stack(S1);break;
			case 4:
				print_Queue(L);
		}
		cout<<endl;
	}
}

大家别光收藏呀,如果觉得代码写的还行顺手点个赞啊…

  • 48
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qzxl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值