摘 要
为了使地面有足够的绿化面积与道路面积,同时保证提供规定数量的停车位,多数大型建筑都在地下室设置停车库。当停车库内的车位超过50个时,往往需要考虑建立停车库管理系统(又称停车库自动化系统,ParkingAutomationPy stem),以提高车库管理的质量、效益与安全性。随着经济的发展,生活水平的不断提高,家庭车辆、社会车辆的拥有量在迅速地增长,由于地面空间有限,停车场车位不足的矛盾显得越来越突出,停车场管理的重要性也会越来越受到重视,而其技术的核心是对车辆的自动监控、识别和自动管理。
关键词:停车场 自动识别 数据结构 栈和队列
第一章 绪 论
-
- 课设主要研究问题
编写满足以下要求的停车场管理程序,设停车场内只有一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序依次由南向北排列(大门在最北端,最先到达的第一辆车停放在停车场的最南端),若停车场内已停满 n 辆车,则后来的汽车只能在门外的便道(即候车场上)等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必 须先退出停车场为它让路,待该车辆开出大门外,其他车辆再依原次序进入停车场,每辆停放在停车场的车在它离开停车场时必须按停留的时间长短交纳费用。
-
- 课设应用的理论知识
1.2.1栈的定义
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据,最后一个数据被第一个读出来。栈具有记忆作用。
1.2.2链队列的定义
链队的存储结构 链队的各项操作初始化入队出队 取队头元素队列的定义栈和队列是两种重要的线性结构,与一般线性表不同,它们是操作受限的特殊线性表,主要用于辅助。
1.2.3栈和链队列的应用
栈在递归中的应用 递归是一种重要的程序设计方法。简单地说,若是在一个函数、过程或数据结构的定义中又应用了它本身,则这个函数、过程或数据结构称为是递归定义的,简称递归。
对于此停车场管理系统的实现,就是用两个堆栈来分别模拟停车场以及停车场内车辆为其它车辆让路时退出停车的临时停放地点。至于通道上车辆的停放则用一个链队列来实现,此时,通道上车辆的离开或者进入停车场只需改变此链队列上的结点而已。对于要对停车场内的车辆根据其停放时间收取相应的停车费用,可以记录下车辆进入以及离开停车场的时间,再用时间差乘以相应的单价并且打印出最后的费用就可以实现了。
第二章 课设实现过程
2.1 栈的顺序结构实现
typedef struct{
int carNumber[10];
int arriveTime[10];
int top;
int size;//容量
}Stack;
//初始化栈
void initStack(Stack &S,int size){
S.top=-1;
S.size=size;
}
//检测栈空
bool emptyStack(Stack &S){
if(S.top==-1){
return false;
}else{
return true;
}
}
//检测栈满
bool fullStack(Stack &S){
if(S.top==S.size-1){
return false;
}else{
return true;
}
}
//入栈
void push(Stack &S,int carNumber,int arriveTime){
S.top++;
S.carNumber[S.top]=carNumber;
S.arriveTime[S.top]=arriveTime;
}
//出栈
void pop(Stack &S,int &carNumber,int &arriveTime){
carNumber=S.carNumber[S.top];
arriveTime=S.arriveTime[S.top];
S.top--;
}
2.2 链队列的实现
//初始化队列
void initQueue(Queue &Q){
Q.front=Q.rear=(queue)malloc(sizeof(qNode));//队头指针、队尾指针指向同一空结点
if(!Q.front){
exit(-1);//内存分配失败,退出
}
Q.front->next=NULL;
}
//判断队列是否为空
bool emptyQueue(Queue &Q){
if(Q.front==Q.rear){
return false;
}else{
return true;
}
}
//入队列
void inQueue(Queue &Q,int carNumber,int arriveTime){
queue p;
p=(queue)malloc(sizeof(qNode));//分配一个结点空间
p->carNumber=carNumber;
p->arriveTime=arriveTime;
p->next=NULL;
Q.rear->next=p;//队尾指针指向p
Q.rear=p;//队尾指针后移一位
position++;
}
//出队列
void outQueue(Queue &Q,int &carNumber,int &arriveTime){
queue p;
p=(queue)malloc(sizeof(qNode));//分配一个结点空间
p=Q.front->next;//指定一个新的结点指向队头指针指向的结点
carNumber=p->carNumber;//返回结点数据值
arriveTime=p->arriveTime;
Q.front->next=p->next;//将p指向的下一数据给队头指针,令下一数据前移到队头
if(Q.rear==p){
Q.rear=Q.front;//使队尾指针回到初始位置
}
delete(p);//释放p所指结点空间
position--;
}
完整代码
#include<stdio.h>
#include<malloc.h>
#include<iostream>
using namespace std;
int position=0;
//栈
typedef struct{
int carNumber[10];
int arriveTime[10];
int top;
int size;//容量
}Stack;
//队列
typedef struct qNode{
int carNumber;
int arriveTime;
struct qNode *next;
}qNode,*queue;
typedef struct{
queue front;
queue rear;
}Queue;
//初始化栈
void initStack(Stack &S,int size){
S.top=-1;
S.size=size;
}
//检测栈空
bool emptyStack(Stack &S){
if(S.top==-1){
return false;
}else{
return true;
}
}
//检测栈满
bool fullStack(Stack &S){
if(S.top==S.size-1){
return false;
}else{
return true;
}
}
//入栈
void push(Stack &S,int carNumber,int arriveTime){
S.top++;
S.carNumber[S.top]=carNumber;
S.arriveTime[S.top]=arriveTime;
}
//出栈
void pop(Stack &S,int &carNumber,int &arriveTime){
carNumber=S.carNumber[S.top];
arriveTime=S.arriveTime[S.top];
S.top--;
}
//初始化队列
void initQueue(Queue &Q){
Q.front=Q.rear=(queue)malloc(sizeof(qNode));//队头指针、队尾指针指向同一空结点
if(!Q.front){
exit(-1);//内存分配失败,退出
}
Q.front->next=NULL;
}
//判断队列是否为空
bool emptyQueue(Queue &Q){
if(Q.front==Q.rear){
return false;
}else{
return true;
}
}
//入队列
void inQueue(Queue &Q,int carNumber,int arriveTime){
queue p;
p=(queue)malloc(sizeof(qNode));//分配一个结点空间
p->carNumber=carNumber;
p->arriveTime=arriveTime;
p->next=NULL;
Q.rear->next=p;//队尾指针指向p
Q.rear=p;//队尾指针后移一位
position++;
}
//出队列
void outQueue(Queue &Q,int &carNumber,int &arriveTime){
queue p;
p=(queue)malloc(sizeof(qNode));//分配一个结点空间
p=Q.front->next;//指定一个新的结点指向队头指针指向的结点
carNumber=p->carNumber;//返回结点数据值
arriveTime=p->arriveTime;
Q.front->next=p->next;//将p指向的下一数据给队头指针,令下一数据前移到队头
if(Q.rear==p){
Q.rear=Q.front;//使队尾指针回到初始位置
}
delete(p);//释放p所指结点空间
position--;
}
//逻辑判断
void load(Stack &S,Stack &LS,Queue &Q,int fee){
int carNumber,arriveTime;
char state;
cout<<"请输入车的状态(A进站/D出站),车牌号和时间(进站时间/出站时间):"<<endl;
cin>>state>>carNumber>>arriveTime;
while(state!='E'){
int leaveTime=arriveTime;
if(state=='A'){
//停车场是否为空
if(fullStack(S)){
push(S,carNumber,arriveTime);//车进入停车场
cout<<"车牌号是 "<<carNumber<<" 的车停在停车场的位置是 "<<S.top+1<<endl;
}
else{
inQueue(Q,carNumber,arriveTime);//停车场非空,停在便道上
cout<<"车牌号是 "<<carNumber<<" 的车在便道的位置是 "<<position<<endl;
}
}
else if(state=='D'){
//查询该车
bool yes=false;
bool is=false;
//无该车
for(int i=0;i<=S.top;i++){
if(S.carNumber[i]==carNumber){
is=true;
break;
}
}
if(!is){
cout<<"停车场无车牌号为 "<<carNumber<<" 的车!"<<endl;
}
for(int j=S.top;j>=0;j--){
if(S.carNumber[j]!=carNumber){
pop(S,carNumber,arriveTime);
push(LS,carNumber,arriveTime);
if(S.top==0){
yes=true;
break;
}
}
else{
yes=true;
break;
}
}
if(yes){
//找到了该车
pop(S,carNumber,arriveTime);//该车离开停车场
cout<<"车牌号是 "<<carNumber<<" 的车离开停车场,停留时间是:"<<(leaveTime-arriveTime)<<
"小时,共花费了 "<<fee*(leaveTime-arriveTime)<<" 元。"<<endl;
//将临时栈里的车放进停车场
while(emptyStack(LS)){
pop(LS,carNumber,arriveTime);
push(S,carNumber,arriveTime);
}
//如果便道上有车,开进停车场
if(emptyQueue(Q)){
outQueue(Q,carNumber,arriveTime);
push(S,carNumber,arriveTime);
}
}
}
cin>>state>>carNumber>>arriveTime;
}
}
int main(){
int size,fee;//size停车场容量,fee每小时停车费
cout<<"请输入停车场最大容量(/小时)以及车在停车场每小时的费用(/元):"<<endl;
cin>>size>>fee;
//定义
Stack S,LS;//S指停车场,LS指临时栈
Queue Q;//队列(便道)
//初始化停车场
initStack(S,size);
initStack(LS,size);
//初始化便道
initQueue(Q);
//加载停车场管理系统
load(S,LS,Q,fee);
}