数据结构 停车场管理报告

更新时间:2023-08-28 05:39:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验二:停车场管理(栈和队列应用)

班级 学号 姓名 一、实验目的

1 掌握队列和栈顺序存储结构和链式存储结构,以便在实际背景下灵活运用。

2 掌握栈和队列的特点,即先进后出与先进先出的原则。

3 掌握栈和队列的基本运算。

二、实验内容

1 问题描述

设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚,依次从停车场最里面向大门口处停放。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短来交费。如果停留在便道上的车未进入停车场就要离去,允许其离开,不收停车费,并且仍然保持在便道上等待的车辆次序。编制一个程序模拟该停车场的管理。

2 实现要求

要求程序输出每辆车到达后的停车位置(停车场或便道),以及某辆车离开停车场时应该交纳的费用和它在停车场内停留的时间。

3 实现提示

汽车的模拟输入信息格式可以为:(到达/离开,汽车牌照号码,到达/离开的时间)。用栈和队列来模拟停车场和便道。

三、实验结果:

头文件

#define MAXSIZE 3

#define price 0.4

typedef struct time {

int hour;

int min;

}Time;

typedef struct car {

char num[10];

Time reach;

Time leave;

}CarNode;

typedef struct SNode {

CarNode *data1[MAXSIZE+1];

int top;

}SeqStackCar;

typedef struct QNode {

CarNode *data2;

struct QNode *next;

}QueueNode;

typedef struct LQNode {

QueueNode *front;

QueueNode *rear;

}LinkQueueCar;

void InitStack(SeqStackCar *s);

int InitQueue(LinkQueueCar *Q);

void Display(CarNode *p,int place);

int Arrival(SeqStackCar *s,LinkQueueCar *LQ);

void Leave1(SeqStackCar *s1,SeqStackCar *s2,LinkQueueCar *LQ);

void Leave2(LinkQueueCar *LQ);

void List1(SeqStackCar *s);

void List2(LinkQueueCar *LQ);

源文件

#include "car.h"

#include<iostream>

using namespace std;

int i=0;

void InitStack(SeqStackCar *s)

{

int i;

s->top=0;

for(i=0;i<=MAXSIZE;i++)

s->data1[s->top]=NULL;

}

int InitQueue(LinkQueueCar *Q)

{

Q->front=new QueueNode;

if(Q->front!=NULL)

{ Q->front->next=NULL;

Q->rear=Q->front;

return 1;

}

else

return 0;

}

void Display(CarNode *p,int place)

{

int A1,A2,B1,B2,time;

cout<<"请输入离开的时间:";

cin>>p->leave.hour;cin>>p->leave.min;

while(p->leave.hour<p->reach.hour||p->leave.hour>23)

{

cout<<"error!"<<endl;

cout<<"请输入离开的时间:";

cin>>p->leave.hour;cin>>p->leave.min;

}

cout<<endl;

cout<<"离开车辆的车牌号为:";cout<<p->num<<endl;

cout<<"其到达时间为: "<<p->reach.hour<<":"<<p->reach.min<<endl;

cout<<"其离开时间为: "<<p->leave.hour<<":"<<p->leave.min<<endl;

A1=p->reach.hour;

A2=p->reach.min;

B1=p->leave.hour;

B2=p->leave.min; time=(B1-A1)*60+(B2-A2); cout<<"该车停在停车场中的时间:"<<time<<"分钟!"<<endl; cout<<"应交费用为: "<<time*price<<"元!"<<endl;

cout<<endl;

}

int Arrival(SeqStackCar *s,LinkQueueCar *LQ)

{

CarNode *p;

QueueNode *t;

p=new CarNode;

cout<<"请输入车牌号(例:A1234):";cin>>p->num;

if(s->top<MAXSIZE)

{

s->top++;

cout<<"车辆在车场第"<<s->top <<"位置!"<<endl;

cout<<"请输入到达时间:";

cin>>p->reach.hour;cin>>p->reach.min;

while(p->reach.hour<0||p->reach.hour>23||p->reach.min<0||p->reach.min>59) {

cout<<"error!"<<endl;

cout<<"请输入到达时间:";

cin>>p->reach.hour;cin>>p->reach.min;

}

s->data1[s->top]=p;

return 1;

}

else

{ cout<<"该车停在便道上!"<<endl;

t= new QueueNode;

t->data2=p;

t->next=NULL;

LQ->rear->next=t;

LQ->rear=t;

i++;

cout<<"车辆在便道"<<i<<"个位置!"<<endl;

return 1;

}

}

void Leave1(SeqStackCar *s1,SeqStackCar *s2,LinkQueueCar *LQ)

{

int place;

CarNode *p,*t;

QueueNode *q;

if(s1->top>0)

{ while(1) { } cout<<"请输入车在车场的位置1--"<<s1->top<<":"; cin>>place; if(place>=1&&place<=s1->top) break;

while(s1->top>place) {

s2->top++;

s2->data1[s2->top]=s1->data1[s1->top];

s1->data1[s1->top]=NULL;

s1->top--;

}

p=s1->data1[s1->top];

s1->data1[s1->top]=NULL;

s1->top--;

while(s2->top>=1)

{ s1->top++;

s1->data1[s1->top]=s2->data1[s2->top];

s2->data1[s2->top]=NULL;

s2->top--;

} Display(p,place); if((LQ->front!=LQ->rear)&&s1->top<MAXSIZE) {

q=LQ->front->next;

t=q->data2;

s1->top++;

cout<<"便道的"<<t->num<<"号车进入车场第"<<s1->top<<"位置!"<<endl; cout<<"请输入到达的时间:"; cin>>t->reach.hour;cin>>t->reach.min; if(t->reach.hour<0||t->reach.hour>23||t->reach.min<0||t->reach.min>59) { } cout<<"error!"<<endl; cout<<"请输入到达时间:"; cin>>t->reach.hour;cin>>t->reach.min; LQ->front->next=q->next; if(q==LQ->rear) LQ->rear=LQ->front; s1->data1[s1->top]=t; delete q;

}

else

cout<<"便道里没有车!"<<endl;

}

else

cout<<"停车场里没有车!"<<endl;

}

void Leave2(LinkQueueCar *LQ)

{

QueueNode *q;

CarNode *t;

if(LQ->front!=LQ->rear) { q=LQ->front->next; t=q->data2; LQ->front->next=q->next; if(q==LQ->rear) LQ->rear=LQ->front; delete q; cout<<"便道上车牌号为"<<t->num<<"的车从便道上离开!"<<endl; } else cout<<"便道里没有车!"<<endl;

}

void List1(SeqStackCar *s)

{

int i;

if(s->top>0)

{

cout<<" 位置 到达时间 车牌号"<<endl;

for(i=1;i<=s->top;i++)

} { } cout<<" "<<i<<" "<<s->data1[i]->reach.hour <<":"<<s->data1[i]->reach.min<<" "<<s->data1[i]->num<<endl;

else

cout<<"停车场里没有车!"<<endl;

}

void List2(LinkQueueCar *LQ)

{

QueueNode *p;

p=LQ->front->next;

if(LQ->front!=LQ->rear)

{ cout<<"便道上车的车牌号为:"<<endl;

while(p!=NULL)

{

cout<<p->data2->num<<endl;

p=p->next;

}

}

else

cout<<"便道上没有车!"<<endl;

}

测试文件

#include "car.h"

#include<iostream>

using namespace std;

void main()

{

SeqStackCar s1,s2;

LinkQueueCar LQ; int m;

InitStack(&s1);

InitStack(&s2);

InitQueue(&LQ);

while(1)

{

cout<<"★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★"<<endl; cout<<"1.车辆到达 2.离开停车场3.离开便道 4.停车场列表 5.便道列表 6.退出系统"<<endl; cout<<"★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★"<<endl; cin>>m;

switch(m)

{

case 1:Arrival(&s1,&LQ);break;

case 2:Leave1(&s1,&s2,&LQ);break;

case 3:Leave2(&LQ);break;

case 4:List1(&s1);break;

case 5:List2(&LQ);break;

case 6:exit(0);

default: break;

}

}

运行结果:(两

个图表联在一

起)

}

四、实验总结

1.学会了栈和队列的综合使用,更加灵活运用栈和队列。

2.栈的特点是后进先出,所以用栈实现停车场的程序。

3.队列的特点是先进先出,所以用队列实现便道的程序。

4.参数为指针时主函数形参的形式。

5.栈与队列的数据为车的信息,写函数时要注意车的信息与栈和队列相结合。

6.出栈时可以增加一个辅助栈,来保存信息。

本文来源:https://www.bwwdw.com/article/kgii.html

Top