主题:挑战高手--停车场管理程序
sunni
[专家分:0] 发布于 2005-06-21 13:53:00
4.停车场管理
[问题描述]
设停车场是一个可停放M辆汽车的狭长通道,且只有—个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列t大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等侯,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的程序。
[实现提示]
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输人数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。
[选作内容]
(1)两个栈共享空间,思考应开辟数组的空间是多少?
(2)汽车可有不同种类,则他们的占地面积不同,收费标准也不同,如l辆客车和1.5 辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。
(3)汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。
(4)停放在便道上的汽车也收费,收费标准比停放在停车场的车低,请思考如何修改结构以满足这种要求。
回复列表 (共6个回复)
沙发
tina444 [专家分:0] 发布于 2005-06-21 16:10:00
我在很多资料书上都看到了你这个题目,你最好是去图书馆阅览室里找找!
板凳
tina444 [专家分:0] 发布于 2005-06-21 21:46:00
停车场系统
#include<iostream.h>
#include<string.h>
#include<iomanip.h>
#define StackSize 8
typedef struct
{char Car_number[StackSize][10];
int top;
}SqStack;//定义栈的结构
void InitStack(SqStack &S)//初始栈的栈顶
{S.top=-1;
}
int StackEmpty(SqStack &S)//判断栈是否为空
{if(S.top==-1)
return 1;
else
return 0;
}
int StackFull(SqStack &S)//判断栈是否为满
{if(S.top==StackSize-1)
return 1;
else
return 0;
}
void StackPush(SqStack &S,char e[])//压栈
{S.top++;
strcpy(S.Car_number[S.top],e);
}
void StackDisplay(SqStack &S)//显示栈的元素
{cout<<"停车场的车:"<<endl;
int i;
for(i=S.top+1;i<StackSize;i++)
cout<<"|"<<setiosflags(ios::left)<<setw(10)<<""<<"|"<<endl;
for(i=S.top;i>=0;i--)
cout<<"|"<<setiosflags(ios::left)<<setw(10)<<S.Car_number<<"|"<<endl;
cout<<"------------"<<endl;
}
void StackPop(SqStack &S,char e[])//将特定值元素弹出
{int flag=0;int k;
if(StackEmpty(S))
cout<<e<<"号码的车找不到!"<<endl;
else
{for(int i=0;i<=S.top&&!flag;i++)
if(!strcmp(S.Car_number,e))
{ k=i;flag=1;}
if(!flag)
cout<<e<<"号码的车找不到!"<<endl;
else
{for(i=k;i<S.top;i++)
strcpy(S.Car_number,S.Car_number[i+1]);
S.top--;
}
}
}
#define QueueSize 9
typedef struct
{char Car_number[QueueSize][10];
int front ,rear;
}SQueue;//定义队列的结构
void InitQueue(SQueue &SQ)//初始队列
{SQ.front=SQ.rear=0;
}
int QueueEmpty(SQueue &SQ)//判断队列是否为空
{if(SQ.front==SQ.rear)
return 1;
else
return 0;
}
int QueueFull(SQueue &SQ)//判断队列是否为满
{if((SQ.rear+1)%QueueSize==SQ.front)
return 1;
else
return 0;
}
void EnQueue(SQueue &SQ,char e[])//元素进队尾
{SQ.rear=(SQ.rear+1)%QueueSize;
strcpy(SQ.Car_number[SQ.rear],e);
}
void OutQueue(SQueue &SQ,char e[])//队首出队列
{ SQ.front=(SQ.front+1)%QueueSize;
strcpy(e,SQ.Car_number[SQ.front]);
}
void QueueDisplay(SQueue &SQ)//显示队列中的元素
{cout<<"便道上的车:\n";
for(int i=(SQ.front+1)%QueueSize;i!=(SQ.rear+1)%QueueSize;i=(i+1)%QueueSize)
cout<<SQ.Car_number<<"<---";
cout<<endl;
}
void Special_OutQueue(SQueue &SQ,char e[])//特定元素出队列
{int k,flag=0,j;
if(QueueEmpty(SQ))
cout<<e<<"号码的车找不到!"<<endl;
else
{for(k=(SQ.front+1)%QueueSize;k!=(SQ.rear+1)%QueueSize&&!flag;k=(k+1)%QueueSize)
if(!strcmp(SQ.Car_number[k],e))
{ flag=1; }
if(!flag)
cout<<e<<"号码的车找不到!"<<endl;
else
{k--;
for(j=k;j!=SQ.rear;j=(j+1)%QueueSize)
strcpy(SQ.Car_number[j],SQ.Car_number[(j+1)%QueueSize]);
SQ.rear=(SQ.rear-1)%QueueSize;
}
}
}
void Car_In(SqStack &S,SQueue &SQ)//模拟进车
{char e[10];
cout<<"please input the number of the car which is coming!\n";
cin>>e;
if(!StackFull(S)&&QueueEmpty(SQ))
StackPush(S, e);
else if(StackFull(S)&&!QueueFull(SQ))
EnQueue(SQ,e);
else if(StackFull(S)&&QueueFull(SQ))
cout<<"The stack and the queue are full,please come later!\n ";
}
void Car_Reset(SqStack &S,SQueue &SQ)//自动调整
{ char e[10];
while(!StackFull(S)&&!QueueEmpty(SQ))
{OutQueue(SQ, e);
StackPush(S,e);
}
}
void Car_Out(SqStack &S,SQueue &SQ)//模拟出车
{int choice;char number[10];
cout<<"1:停车场的有车要离开\n2:便道上有车要离开\n";
cin>>choice;
switch(choice)
{case 1:
cout<<"input the car number which is leaving!\n";
cin>>number;
StackPop(S,number);
break;
case 2:
cout<<"input the car number which is leaving!\n ";
cin>>number;
Special_OutQueue(SQ,number);
break;
default:
cout<<"error ";break;
}
Car_Reset(S,SQ);
}
void re_start(SqStack &S,SQueue &SQ)//使停车场和便道车为空
{S.top=-1;
SQ.front=SQ.rear=0;
}
void display_all(SqStack &S,SQueue &SQ)//显示停车场和便道车的情况
{QueueDisplay(SQ);
StackDisplay(S);
}
void di()
{cout<<"\t\t********************************************\n";
cout<<"\t\t1:模拟进车 3:显示停车场和便道车的情况 \n";
cout<<"\t\t2:模拟出车 4:重新开始(停车场和便道车为空) \n";
cout<<"\t\t5:退出\n";
cout<<"\t\t********************************************\n";
}
void main()
{int m;
SqStack S;
InitStack(S);
SQueue SQ;
InitQueue(SQ);
cout<<"\t\t********************************************\n";
cout<<"\t\t\t\t停车场模拟系统\n";
cout<<"\t\t\t\t开发者: 胡小勇\n";
cout<<"\t\t\t\t\t时间:2004/5/21\n" ;
cout<<"\t\t********************************************\n";
di();
cin>>m;
while(m!=5)
{switch(m)
{case 1:Car_In(S,SQ);break;
case 2:Car_Out(S,SQ);break;
case 3: display_all(S,SQ);break;
case 4:re_start(S,SQ);break;
default:
cout<<"why do you input the wrong number!\n";
}
di();
cin>>m;
}
}
3 楼
tina444 [专家分:0] 发布于 2005-06-21 21:48:00
停车场系统
#include<iostream.h>
#include<string.h>
#include<iomanip.h>
#define StackSize 8
typedef struct
{char Car_number[StackSize][10];
int top;
}SqStack;//定义栈的结构
void InitStack(SqStack &S)//初始栈的栈顶
{S.top=-1;
}
int StackEmpty(SqStack &S)//判断栈是否为空
{if(S.top==-1)
return 1;
else
return 0;
}
int StackFull(SqStack &S)//判断栈是否为满
{if(S.top==StackSize-1)
return 1;
else
return 0;
}
void StackPush(SqStack &S,char e[])//压栈
{S.top++;
strcpy(S.Car_number[S.top],e);
}
void StackDisplay(SqStack &S)//显示栈的元素
{cout<<"停车场的车:"<<endl;
int i;
for(i=S.top+1;i<StackSize;i++)
cout<<"|"<<setiosflags(ios::left)<<setw(10)<<""<<"|"<<endl;
for(i=S.top;i>=0;i--)
cout<<"|"<<setiosflags(ios::left)<<setw(10)<<S.Car_number<<"|"<<endl;
cout<<"------------"<<endl;
}
void StackPop(SqStack &S,char e[])//将特定值元素弹出
{int flag=0;int k;
if(StackEmpty(S))
cout<<e<<"号码的车找不到!"<<endl;
else
{for(int i=0;i<=S.top&&!flag;i++)
if(!strcmp(S.Car_number,e))
{ k=i;flag=1;}
if(!flag)
cout<<e<<"号码的车找不到!"<<endl;
else
{for(i=k;i<S.top;i++)
strcpy(S.Car_number,S.Car_number[i+1]);
S.top--;
}
}
}
#define QueueSize 9
typedef struct
{char Car_number[QueueSize][10];
int front ,rear;
}SQueue;//定义队列的结构
void InitQueue(SQueue &SQ)//初始队列
{SQ.front=SQ.rear=0;
}
int QueueEmpty(SQueue &SQ)//判断队列是否为空
{if(SQ.front==SQ.rear)
return 1;
else
return 0;
}
int QueueFull(SQueue &SQ)//判断队列是否为满
{if((SQ.rear+1)%QueueSize==SQ.front)
return 1;
else
return 0;
}
void EnQueue(SQueue &SQ,char e[])//元素进队尾
{SQ.rear=(SQ.rear+1)%QueueSize;
strcpy(SQ.Car_number[SQ.rear],e);
}
void OutQueue(SQueue &SQ,char e[])//队首出队列
{ SQ.front=(SQ.front+1)%QueueSize;
strcpy(e,SQ.Car_number[SQ.front]);
}
void QueueDisplay(SQueue &SQ)//显示队列中的元素
{cout<<"便道上的车:\n";
for(int i=(SQ.front+1)%QueueSize;i!=(SQ.rear+1)%QueueSize;i=(i+1)%QueueSize)
cout<<SQ.Car_number<<"<---";
cout<<endl;
}
void Special_OutQueue(SQueue &SQ,char e[])//特定元素出队列
{int k,flag=0,j;
if(QueueEmpty(SQ))
cout<<e<<"号码的车找不到!"<<endl;
else
{for(k=(SQ.front+1)%QueueSize;k!=(SQ.rear+1)%QueueSize&&!flag;k=(k+1)%QueueSize)
if(!strcmp(SQ.Car_number[k],e))
{ flag=1; }
if(!flag)
cout<<e<<"号码的车找不到!"<<endl;
else
{k--;
for(j=k;j!=SQ.rear;j=(j+1)%QueueSize)
strcpy(SQ.Car_number[j],SQ.Car_number[(j+1)%QueueSize]);
SQ.rear=(SQ.rear-1)%QueueSize;
}
}
}
void Car_In(SqStack &S,SQueue &SQ)//模拟进车
{char e[10];
cout<<"please input the number of the car which is coming!\n";
cin>>e;
if(!StackFull(S)&&QueueEmpty(SQ))
StackPush(S, e);
else if(StackFull(S)&&!QueueFull(SQ))
EnQueue(SQ,e);
else if(StackFull(S)&&QueueFull(SQ))
cout<<"The stack and the queue are full,please come later!\n ";
}
void Car_Reset(SqStack &S,SQueue &SQ)//自动调整
{ char e[10];
while(!StackFull(S)&&!QueueEmpty(SQ))
{OutQueue(SQ, e);
StackPush(S,e);
}
}
void Car_Out(SqStack &S,SQueue &SQ)//模拟出车
{int choice;char number[10];
cout<<"1:停车场的有车要离开\n2:便道上有车要离开\n";
cin>>choice;
switch(choice)
{case 1:
cout<<"input the car number which is leaving!\n";
cin>>number;
StackPop(S,number);
break;
case 2:
cout<<"input the car number which is leaving!\n ";
cin>>number;
Special_OutQueue(SQ,number);
break;
default:
cout<<"error ";break;
}
Car_Reset(S,SQ);
}
void re_start(SqStack &S,SQueue &SQ)//使停车场和便道车为空
{S.top=-1;
SQ.front=SQ.rear=0;
}
void display_all(SqStack &S,SQueue &SQ)//显示停车场和便道车的情况
{QueueDisplay(SQ);
StackDisplay(S);
}
void di()
{cout<<"\t\t********************************************\n";
cout<<"\t\t1:模拟进车 3:显示停车场和便道车的情况 \n";
cout<<"\t\t2:模拟出车 4:重新开始(停车场和便道车为空) \n";
cout<<"\t\t5:退出\n";
cout<<"\t\t********************************************\n";
}
void main()
{int m;
SqStack S;
InitStack(S);
SQueue SQ;
InitQueue(SQ);
cout<<"\t\t********************************************\n";
cout<<"\t\t\t\t停车场模拟系统\n";
cout<<"\t\t\t\t开发者: 胡小勇\n";
cout<<"\t\t\t\t\t时间:2004/5/21\n" ;
cout<<"\t\t********************************************\n";
di();
cin>>m;
while(m!=5)
{switch(m)
{case 1:Car_In(S,SQ);break;
case 2:Car_Out(S,SQ);break;
case 3: display_all(S,SQ);break;
case 4:re_start(S,SQ);break;
default:
cout<<"why do you input the wrong number!\n";
}
di();
cin>>m;
}
}
4 楼
cjqcjq2008 [专家分:0] 发布于 2005-06-22 17:05:00
楼上的,你的程序编译有错误呀!!!
5 楼
piaoyaoyudie [专家分:0] 发布于 2007-04-17 12:42:00
请问你最终怎样把那个程序改正确的 急
6 楼
lt19870917 [专家分:750] 发布于 2007-04-21 23:37:00
仅仅是堆栈和队列的一个模拟问题,不需要什么复杂的数据结构和算法
我来回复