#include<iostream>
using namespace std;
#define StackSize 5
#define OK 1
#define ERROR 0
typedef int Status;
typedef struct
{
int cno;//车牌号
int arriveTime;//进入停车场的时间;
int pushTime;//停车时间;
int leaveTime;//离开停车场的时间;
}Car;
//定义栈数据结构
typedef struct{
Car elem[StackSize];
int top;
}SeqStack;
//初始化栈
void InitStack(SeqStack *S)
{
S->top=-1;
}
//判断栈是否为空
//空返回 1
//非空返回 0
int IsEmpty(SeqStack *S)
{
if(S->top==-1)return 1;
else return 0;
}
//判断栈满
//栈满返回 1
//栈不满返回 0
int IsFull(SeqStack *S)
{
if(S->top==StackSize-1)return 1;
else return 0;
}
//进栈 成功返回1 失败返回0
Status push(SeqStack *S,Car car)
{
if(IsFull(S)==1) return ERROR;
else
{
S->top++;
S->elem[S->top]=car;
return OK;
}
}
Status pop(SeqStack *S,Car *car)
{
if(IsEmpty(S)==1)
{
return ERROR;
}
else
{
*car = S->elem[S->top];
S->top--;
return OK;
}
}
//定义队列数据结构
typedef struct QNode{
Car car;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;
//初始化队列
Status InitQueue(LinkQueue *Q)
{
Q->front=new QNode;
if(Q->front!=NULL)
{
Q->rear=Q->front;
Q->front->next=NULL;
Q->rear->next=NULL;
return OK;
}
else return ERROR;
}
//入队操作
Status EnQueue(LinkQueue *Q,Car car1)
{
//新建一个节点,插入队尾
QNode *p = new QNode;
if(p!=NULL)
{
p->car=car1;
p->next=NULL;
Q->rear->next=p;
//将最后一个插入的节点设为尾结点
Q->rear=p;
return OK;
}
else return ERROR;
}
Status DeQueue(LinkQueue *Q,Car *car1){
QNode *p;
if(Q->front==Q->rear){
return ERROR;
}
else{
p = Q->front->next;
Q->front->next=p->next;//将队头更新
*car1 = p->car;
//判断如果这个时候是否队列为空,是的话收尾指针相等
if(Q->rear==p){
Q->front=Q->rear;
}
delete p;
return OK;
}
}
//查找栈中有无车牌信息--temp代表出栈的位置....-1代表无车牌
Status searchCar(SeqStack *S,Car car)
{
SeqStack *p=NULL;
p=S;
int temp = p->top;
while(temp>=0)
{
if(p->elem[temp].cno==car.cno)
{
return temp;
}
temp--;
}
return -1;
}
void showSCar(SeqStack *S){
cout<<"-------------------停靠车辆信息------------------\n";
for(int temp=0;temp<=S->top;temp++)
{
cout<<"----------------------------------------\n";
cout<<" 停靠车辆"<<temp+1<<"号\n";
cout<<"车牌号:"<<S->elem[temp].cno<<"\n";
cout<<"到达时间:"<<S->elem[temp].arriveTime<<"\n";
cout<<"停车时间:"<<S->elem[temp].pushTime<<"\n";
cout<<"----------------------------------------\n";
}
}
//显示队列里的车
void showQCar(LinkQueue *L){
QNode *p=L->front->next;
cout<<"-------------------等待车辆信息------------------\n" ;
int temp = 0;
while(p!=NULL)
{
cout<<"----------------------------------------\n";
cout<<" 等待车辆"<<temp+1<<"号\n";
cout<<"车牌号:"<<p->car.cno<<"\n";
cout<<"到达时间:"<<p->car.arriveTime<<"\n";
cout<<"----------------------------------------\n";
p=p->next;
temp++;
}
}
//输入车辆信息并且入栈或入队
void inputCarData(SeqStack *S,LinkQueue *L){
Car car;
cout<<"请输入车牌号:";
cin>>car.cno;
//判断车牌号是否重复
if(searchCar(S,car)!=-1){
cout<<"车牌号重复!\n";
cout<<"请重新输入车牌信息:";
cin>>car.cno;
}
cout<<"请输入到达时间:";
cin>>car.arriveTime;
if(car.arriveTime<0 || car.arriveTime>24)
{
cout<<"时间输入不合法(0-24)重新输入:\n";
cin>>car.arriveTime;
}
car.pushTime=car.arriveTime;
//车辆进栈--先判断栈是否满
if(IsFull(S)==1){
showSCar(S);
//栈满的情况,下面来的进队列中
EnQueue(L,car);
showQCar(L);
}
//栈没满的情况
else{
push(S,car);
//显示进栈车辆信息
showSCar(S);
}
}
//离开停车位
void leaveStack(SeqStack *S,SeqStack *Se,LinkQueue *Q)
{
if(IsEmpty(S)==1)
{
cout<<"此时没有车辆停靠,无法出栈";
return;
}
int temp;//车牌号标志
int leaveTime;//离开时间
Car car;
cout<<"请输入离开的车号:";
cin>>temp;
car.cno=temp;
int flag = searchCar(S,car);
while(flag==-1)//判断输入的车牌号是否在停车场
{
cout<<"停车场没有此车,请重新输入车牌号:";
cin>>temp;
car.cno=temp;
flag=searchCar(S,car);
}
cout<<"请输入出栈时间:";
cin>>leaveTime;
while(leaveTime<=S->elem[flag].arriveTime)
{
cout<<"离开时间必须大于停车时间!重新输入:";
cin>>leaveTime;
}
//显示出栈的车辆
cout<<"-------------------离去车辆信息------------------\n";
cout<<"车牌号:"<<S->elem[flag].cno<<"\n";
cout<<"价格:"<< leaveTime-S->elem[flag].arriveTime<<"\n";
cout<<"离开时间:"<< leaveTime<<"\n";
if(flag==S->top)
{
Car *c=new Car;
pop(S,c);
}
//不在栈顶
else
{
for(int i=S->top;i>=flag;i--){
Car *c=new Car;
//先入栈再出战
if(i==flag)
{
pop(S,c);
}
else{
push(Se,S->elem[i]);
pop(S,c);
}
}
for(int j=Se->top;j>=0;j--)
{
Car *c=new Car;
pop(Se,c);
push(S,*c);
}
}
//判断队列是否有等待车辆--有的话对头入栈
if(Q->rear!=Q->front){
Car *c = new Car;
DeQueue(Q,c);
c->pushTime=leaveTime;
push(S,*c);
showSCar(S);
showQCar(Q);
}
else
showSCar(S);
}
//菜单选择
int menu()
{
char n;
int flag;
cout<<"\n -------------------------------------------\n";
cout<<"\n *************1. 停车 **************\n";
cout<<"\n *************2. 离开 **************\n";
cout<<"\n *************3. 结束程序 **********\n";
cout<<"\n -------------------------------------------\n";
cout<<"菜单选择:1,2,3: ";
cin>>flag;
while(flag<1||flag>3)
cin>>flag;
cout<<"\n";
return flag;
}
int main()
{
//车辆栈
SeqStack *S = new SeqStack;
InitStack(S);
//车辆在路边停靠的队列
LinkQueue *L= new LinkQueue;
InitQueue(L);
//辅助栈存储让位的信息
SeqStack *Se = new SeqStack;
InitStack(Se);
cout<<"\n-----------------------停车场管理系统----------------\n";
while(1)
{
switch(menu()){
case 1:inputCarData(S,L);
break;
case 2:leaveStack(S,Se,L);
break;
case 3:return 0;
}
}
}
数据结构 停车场管理系统
最新推荐文章于 2024-06-25 15:00:35 发布