栈与队列应用举例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的先后次序从停车场最里面向门口处停放最先到达的第一辆车停在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就可进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车辆都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进入。每辆车在离开停车场时,根据它在停车场内停留时间的长短交费。如果停在便道上的车辆未进停车场就要离去,允许其离去时不收停车费,并且仍然保持在便道上等待的车辆的次序。
现在编制一个程序来模拟停车场的管理。
首先确定模拟程序中需要的数据结构及其操作。
由于停车场只有一个大门,因此可用一个栈来模拟;根据便道停车的特点,先排队的车辆先离开便道进入停车场,可以用一个队列来模拟;又因为排在停车场中间的车辆可以提前离开,因此还需要有一个地方(车辆规避所)保存为了让路离开停车场的车辆,很显然这也应该用一个栈来模拟。所以在程序中设置了两个顺序栈s1和s2分别表示停车场和规避所;设置了一个链队列q表示便道。它们的数据类型定义在下面的源程序中,为了操作方便,链队列表头结点中的num域中
存放便道上的车辆数量。
程序执行时,当输入数据表示有车辆到达时,判断栈s1是否满,若未满就将新数据进栈s1;若栈已满,就将数据入队列q,表示车辆在便道上等待进入停车场。该操作过程由函数Arrive完成。当输入数据表示有车辆要离去时,就在栈s1中寻找此车牌号的车辆,如寻找到就让其离开停车场,并根据停车时间计费,同时将队列q的队头元素进栈s1;如没有找到,就到队列q中去寻找此车牌号的车辆。如在队列q中找到就允许其离开队列,并不收费;如找不到就显示出错信息。当离开停车场的车辆位于栈s1的中间时,必须先将此位置到栈顶之间的所有数据倒到栈s2中去,然后安排车辆出栈s1,最后将栈s2中的数据倒回到栈s1中来。该操作过程由函数Delive 完成。显然,以上两个主要操作需要利用栈和队列的两个基本操作入栈(队列)和出栈(队列)来实现。源程序中的函数Display则可以随时显示停车场的状况。
#include"stdio.h"
#define N10/*停车场容量*/
#define M5/*停车单价*/
#define True 1
#define False0
typedef struct{int num;/*车牌号*/
int arrtime;/*到达/离开时间*/
}ELEMTP;/*顺序栈的数据元素类型*/
typedef struct{
ELEMTP elem[N];
int top;
}SqStack;/*顺序栈类型*/
typedef struct node{
int num;/*车牌号/便道上的车辆数量*/
struct node*next;
}QNode;/*链队列的数据元素类型*/
typedef struct{
QNode*front,*rear;
}LQueue;/*链队列类型*/
void InitStack_Sq(SqStack*s);/*初始化栈*/
int Push_Sq(SqStack*s,ELEMTP x);/*入栈*/
ELEMTP Pop_Sq(SqStack*s);/*出栈*/
void InitQueue_L(LQueue *q); /*初始化队列*/
void EnQueue_L(L LQueue*q,int num1);/*入队列*/ int DelQueue_L(LQueue*q);/*出队列*/
V oid InitStack_Sq(SqStack *s)
{s->top=0;
}
Int Push_Sq(SqStack *s,ELEMTP x)
{if(s->top==N)
return(False);
else
{s->elem[s->top]=x;s->top++;
return(True);
}
}
ELEMTP Pop_Sq(SqStack *s)
{ELEMTP x;
if(s->top==0)
{x.num=NULL;
x.arrtime=NULL;
return(x);
}
else
{s->top--;
return(s->elem[s->top]);
}
}
void InitQueue_L(LQueue *q)
精选文库
{q->front=(QNode *)malloc(sizeof(QNode));
q->rear=q->front;
q->front->next=NULL;
q->front->num=0;
}
void EnQueue_L(Lqueue*q,int num1)
{QNode*p;
p=(QNode*)malloc(sizeof(QNode));
p->num=num1;
p->next=NULL;
q->rear->next=p;
q->rear=p;
q->front->num++;
}
int DelQueue_L(LQueue *q)
{QNode*p;
int n;
if(q->front==q->rear)
return(NULL);
else
{p=q->front->next;
q->front->next=p->next;
if(p->next==NULL)
q->rear=q->front;
n=p->num;
free(p);
q->front->num--;
return(n);
}
}
void Arrive(SqStack*s1,LQueue*q,ELEMTP x){
/*车辆x进入停车场*/
int f;
f=Push_Sq(s1,x);
if(f==False){/*停车场栈s1已满入便道q*/
EnQueue_L(q,x.num);
printf("第%d号车停在便道第%d车位上\n",x.num,q->front->num);
}
else printf("第%d号车停在停车场第%d车位上\n",x.num,s1->top);
}/* Arrive*/