栈和队列的使用实例,停车场管理系统的使用
#include <iostream.h>
const int N=3; //停车场的长度
const int M=6; //单位时间内停车场收费值
typedef struct{
int num; //车辆编号
int arrtime; //到达或离开时间,停车场时间收费值按小时算
}element;
struct seqstack{
element stack[N+1];
int top;
}s1,s2;
struct link{
element data;
link *next;
};
struct queue{
link *front,*rear;
}q;
seqstack inistack(seqstack s){ //栈的初始化
s.top=0;
return s;
}
seqstack push(seqstack s,element x) //进栈
{
s.top++;
s.stack[s.top]=x;
return s;
}
seqstack pop(seqstack s) //退栈
{
s.top--;return s;
}
element gettop(seqstack s) //取栈顶元素
{
return s.stack[s.top];
}
int empty(seqstack s) //判栈空
{
if(s.top==0) return 1;
else return 0;
}
queue iniqueue(queue s) //链队列初始化
{
link *p;
p=new link;
p->next=NULL;
s.front=s.rear=p;
return s;
}
queue inqueue(queue s,element x) //进队
{
link *p;
p=new link;
p->data=x;
p->next=s.rear->next;
s.rear->next=p;
s.rear=p;
return s;
}
queue outqueue(queue s) //出队
{
link *p=s.front;
s.front=p->next;
delete p;
return s;
}
element gethead(queue s) //取队头元素
{
return s.front->next->data;
}
int emptyqueue(queue s)
{
if(s.front==s.rear) return 1;
else return 0;
}
//处理车辆到达的情形
void arrive(element x)
{
//X为到达的车辆
if(s1.top==N)
q=inqueue(q,x); //进入便道
else s1=push(s1,x); //进入停车场
}
//处理车辆离开的情形
void live(element x)
{
//X为离开的车辆
int f=1;element y;
link *r;
while(!empty(s1)&&(f==1)) //在停车场中找要离开的车辆
if(s1.stack[s1.top].num!=x.num)
{ y=gettop(s1); s1=pop(s1); s2=push(s2,y);}
else{ f=0;y=gettop(s1);s1=pop(s1);
cout<<"停车场中有编号为"<<x.num<<"的车"<<endl;
cout<<"该车将离开,应收停车费:"<<(x.arrtime-y.arrtime)*M<<"元\n"<<endl;
while(!empty(s2))
{
y=gettop(s2);s2=pop(s2);s1=push(s1,y);
}
//停车场中离开一辆车后,便道上第一辆车进停车场
if(!emptyqueue(q)){
y=gethead(q); //取队头元素
q=outqueue(q); //出队
s1=push(s1,y);} //进栈
}
if(empty(s1)) //停车场中无给定的车辆,则到便道上找
{
while(!empty(s2))
{
y=gettop(s2);
s2=pop(s2);
s1=push(s1,y);
}
if(!emptyqueue(q))
{
link *p=q.front;
while((p!=NULL)&&(p->data.num!=x.num))
{
r=p;
p=p->next;
}
if(!emptyqueue(q))
{
link *p=q.front;
while((p!=NULL)&&(p->data.num!=x.num))
{
r=p;
p=p->next;
}
if(p!=NULL)
{
cout<<"便道上有编号为"<<x.num<<"的车辆"<<endl;
cout<<"该车将离开,应收停车费0.00元:\n"<<endl;
r->next=p->next;delete p;}
else
cout<<"便道上没有编号为"<<x.num<<"的车辆,输入的车辆不存在!!!\n"<<endl;
}
}
}
}
void process1() //输出停车场中的车辆编号和到达时间
{
int t=s1.top;
cout<<"停车场中的车辆编号和到达时间"<<endl;
while(t!=0)
{
cout<<s1.stack[t].num<<" "<<s1.stack[t].arrtime<<endl;
t--;
}
cout<<endl;
}
void process2() //输出便道中的车辆编号和到达时间
{
link *p=q.front->next;
cout<<"便道中的车辆编号和到达时间"<<endl;
while(p!=NULL){
cout<<p->data.num<<" "<<p->data.arrtime<<endl;
p=p->next;
}
cout<<endl;
}
void main()
{
int n;
element x;
s1=inistack(s1);
s2=inistack(s2);
q=iniqueue(q);
while(1){
cout<<endl;
cout<<"请输入车辆编号,到达或离开的时间\n"
<<"[例如(8 8) 说明停车场时间收费值按小时算]"<<endl;
cin>>x.num>>x.arrtime;
cout<<"请选择处理车辆的事件\n"
<<"1) 到达 \n"
<<"2) 离开 \n"
<<"3) 结束 \n";
cin>>n;
if(n==1)
{
arrive(x);process1();process2();
}
else if(n==2) {live(x);process1();process2();}
else break;
}
cout<<endl;
}
问题点数:1、回复次数:2Top
1 楼mmmcd(超超)回复于 2003-06-02 13:45:33 得分 0
有什么问题呢?Top
2 楼zest342(珊珊)回复于 2003-06-02 20:35:01 得分 1
自定义汽车信息数据类型:
struct node
{char mes;
int carnumber ,intime ,outime ;
};
自定义链表数据类型:
struct queue_node
{nodelist data;
struct queue_node *next ;
};
基本操作:
addqueue(nodelist value)
初始条件:队列已存在
操作结果:将value 插入到队尾
nodelist delqueue()
初始条件:队列已存在
操作结果:删除队尾元素,并返回其值
主程序:
main()
{初始化;
输入数据;
while(p.mes!='E')
{ switch(p.mes)
{case 'A' :入栈;
case 'D':出栈;
计算时间;}}
一. 详细设计
#define n 5 //模似停车场栈的大小
#define Null 0
struct node //汽车信息数据类型
{char mes;
int carnumber ,intime ,outime ;
};
typedef struct node nodelist ; //队列数据类型
struct queue_node
{nodelist data;
struct queue_node *next ;
};
typedef struct queue_node queue_list ;
typedef struct queue_node *link;
link front =Null;
link rear =Null;
status addqueue(nodelist value)
{
new_node=(link)malloc(sizeof(queue_list));
new_node->data=value;
new_node->next=Null;
if(rear==Null)
front=new_node;
else
rear->next =new_node;
rear=new_node;
}
status delqueue()
{ if(front!=Null)
{first=front;
front=front->next;
temp=first->data;
free(first);
return(temp);}
}
main()
index=-1; //记录进入停车场的车辆数目
scanf("%c%d%d%d",&p.mes,&p.carnumber,&p.intime,&p.outime);
while(p.mes!='E')
{switch(p.mes)
{case 'A' :
{if(top<n) //入栈
{stack[top]=p;
++top;
++index;
}
else
addqueue(p); //如栈满则入队列
}
break;
case 'D': //对应元素出栈
{while(p.carnumber!=stack[k].carnumber)
k++;
q=stack[k];
top=index;
while(top>k)
{stacktemp[toptemp]=stack[top];
toptemp++;
top--;}
toptemp=index-k-1;
top=k;
while(toptemp>=0)
{stack[top]=stacktemp[toptemp];
top++;
toptemp--;}
q.outime=p.outime;
result=q.outime-q.intime;
printf("%d",result);
index--;
if(index+2==n && front !=Null) //若栈内还有一个空间且队列非空,则将队列中头一个元素入栈,并修改队头元素的入栈时间
{ index++;
top=index;
r=delqueue();
stack[top]=r;}
} }
scanf("%c%d%d%d",&p.mes,&p.carnumber,&p.intime,&p.outime);
}
}
Top




