栈和队列及其应用——停车场管理

  • 格式:doc
  • 大小:120.50 KB
  • 文档页数:8

下载文档原格式

  / 8
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

华北水利水电学院数据结构实验报告

2012~2013学年第一学期2010级计算机科学与技术专业

班级:2010136 学号:201013624 姓名:柴有为

实验二栈和队列及其应用

一、实验题目:

栈和队列及其应用——停车场管理

二、实验内容:

设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北段),若停车厂内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车迹可开入;停车场内某辆车要离开时,在它之后进入的车连必须先退出车厂为它让路,待该车辆开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车时必须按它停留的时间长短缴纳费用。编写按上述要求进行管理的模拟程序。

可以将停车场定义成一个顺序栈s0,便道定义成一个链队列q,而停车场中的某辆车要离开,则在它后面进停车场的车必须让道,让其离开,所以必须有一个临时的顺序栈s1,存放让道的车辆。

当有车辆进停车场时,若栈s0不满,则直接进入栈s0;若栈s0满,则进入便道(链队列q)。若有s0中车辆x离开时,先让在x后面进栈的车从s0退栈并进入栈s1中,让x离开并收取停车费(在便道上停留的时间不收费),然后再把s1中所有元素退栈并重新进入s0栈,最后,将链队列q中的队头元素出队并进栈到s0中。

三、程序源代码:

#include

#include

#include

typedef struct{

long* base;

long* top;

int stacksize;

}SqStack;

typedef struct QNode{

long data;

struct QNode* next;

}QNode,*QueuePtr;

typedef struct{

QueuePtr front;

QueuePtr rear;

int lenth;

}LinkQueue;

bool InitStack(SqStack &S,int capacity){

S.base=(long*)malloc(10 * sizeof(long));

if(!S.base)exit(1);

S.top=S.base;

S.stacksize=capacity;

return 1;

}//InitStack

bool Push(SqStack &S,long e){

if(S.top-S.base>=S.stacksize){

S.base=(long*)realloc(S.base,(S.stacksize+10)*sizeof(long));

if(!S.base)exit(1);

S.top=S.base+S.stacksize;

S.stacksize+=10;

}

*S.top++=e;

return 1;

}//Push

bool Pop(SqStack &S,long &e){

if(S.top==S.base) return 0;

e=*--S.top;

return 1;

}//Pop

bool InitQueue(LinkQueue &Q){

Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));

if(!Q.front)exit(1);

Q.front->next=NULL;

Q.lenth=0;

return 1;

}

bool EnQueue(LinkQueue &Q,long e)

{

QueuePtr p;

p=(QueuePtr)malloc(sizeof(QNode));

if(!p)exit(1);

p->data=e;p->next=NULL;

Q.rear->next=p;

Q.rear=p;

Q.lenth++;

return 1;

}

bool DeQueue(LinkQueue &Q,long &e)

{

QueuePtr p;

if(Q.front==Q.rear)return 0;

p=Q.front->next;

e=p->data;

Q.front->next=p->next;

if(Q.rear==p)Q.rear=Q.front;

free(p);

Q.lenth--;

return 1;

}

void park(SqStack &a,LinkQueue &b,int capacity) {

if((a.top-a.base)

{

time_t t1;

time(&t1);

Push(a,t1);

printf("停车成功,车位号%d\n",a.top-a.base);

}

else

{

printf("停车场已满,进入便道\n");

EnQueue(b,0);

}

}

void leave(SqStack &a,SqStack &s,int b,int 单价) {

long* t=a.base+b-1;

if(t>=a.top||t

{

printf("该车位没有车辆\n");

return;

}

else

{

long* p;

long e;

long rt;

time_t n;

time(&n);