数据结构 停车场管理系统

#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;
        }
    }
	
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值