停车的管理系统

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int Max;//容量
typedef struct
{
    int *base;//起始地址
    int stacksize;//大小
    int front;//头
    int rear;//尾
} Queue; //队列结构
typedef struct
{
    int * base;//栈底
    int * top;//栈顶
    int stacksize;//栈大小
} Stack;//栈结构
void Init_Queue(Queue *Q)//初始化队列
{
    Q->base = (int*)malloc(Max * sizeof(int));//开辟空间
    Q->stacksize = Max;
    Q->front = Q->rear = 0;
}
int QueueLength(Queue *Q)//队列长度
{
    return Q->rear - Q->front;
}
int Queue_GetHead(Queue *Q, int * elem)//获取队头元素
{
    if(Q->rear==Q->front)//空队列
    {
        return -1;
    }
    else
    {
        *elem = *(Q->front+Q->base);//取队头
        return 1;
    }
}
int Queue_Push(Queue *Q, int * elem)//入队
{
    if(Q->rear==Q->stacksize)   //队列已满
    {
        Q->base = (int*)realloc(Q->base, (Q->stacksize+Max)*sizeof(int));//重新分配空间
        if(!Q->base)//分配失败
            return -1;//失败
        Q->stacksize += Max;//更新队列大小
    }
    *(Q->base+Q->rear) = *elem;//入队
    Q->rear++;//尾指针变动
    return 1;
}
int Queue_Pop(Queue *Q)//出队
{
    if(Q->rear==Q->front)
        return -1;//队列为空
    Q->front++;//不为空,出队
    return 1;
}
int Queue_Empty(Queue *Q)//判断队列是否为空
{
    if(Q->front==Q->rear)
        return 1;//空
    else
        return 0;//非空
}
void Init_Stack(Stack *S)//初始化栈
{
    S->base = (int *)malloc(Max*sizeof(int));//为栈指针分配空间
    S->top = S->base;//初始化
    S->stacksize = Max;//栈的大小
}
int Stack_Empty(Stack *S)//判断栈是否为空
{
    if(S->base==S->top)//如果栈为空
        return 1;//返回1
    else//不为空
        return 0;//返回0
}
int Stack_GetTop(Stack *S, int *elem)//获取栈顶元素的值
{
    if(S->base==S->top)//如果栈为空
        return -1;//跳出
    *elem = *(S->top-1);//返回栈顶元素的值
    return 1;
}
int StackLength(Stack *S)//栈此时的大小
{
    return S->top - S->base;
}
int Stack_Pop(Stack *S)//栈顶元素出栈
{
    if(S->top==S->base)//如果当前栈为空
        return -1;//直接返回
    S->top--;//栈顶指针移动
    return 1;
}
int Stack_Push(Stack *S, int *elem)//元素入栈
{
    if((S->top-S->base)==Max)   //如果栈满
    {
        return -1;
    }
    *(S->top) = *elem;//将元素加入栈顶
    S->top++;//指针移动
    return 1;
}
int main()
{
    Stack Stack1, Stack2;//两个栈
    Queue Queue1;//1个队列
    Init_Queue(&Queue1);//初始化
    Init_Stack(&Stack1);
    Init_Stack(&Stack2);
    int Stackhead = -1;//栈顶
    int Queuehead = -1;//队头
    int Stack_array[5111];//标记数组
    int Queue_array[5111];
    memset(Queue_array, 0, sizeof(Queue_array));//初始化
    memset(Stack_array, 0, sizeof(Stack_array));
    char op[12];//操作名称
    printf("*****************^o^欢迎使用停车管理系统^o^********************\n");
    printf("\n停车场管理系统:\n\n请输入车库容量(最大为9):\n");
    scanf("%d", &Max);//容量
    while(Max>=10)
    {
        printf("\n你需要的容量太大,请输入正确的容量:\n");
        scanf("%d", &Max);
    }
    printf("\n请输入您所需要的服务:\n");
    printf("             1 停车\n");
    printf("             2 取车\n");
    printf("             3 退出系统\n");
    printf("             4 管理员界面(密码可进)\n");
    while(~scanf("%s", op))
    {
        if(strcmp(op, "1")==0)   //停车
        {
            printf("*****************进入停车管理子系统********************\n");
            printf("请输入停车车牌号:\n");
            int name;
            scanf("%d", &name);
            if(Stack_array[name]==1||Queue_array[name]==1)
            {
                printf("\n此车辆%d已在车库中。\n", name);
            }
            else if(Stack_Push(&Stack1, &name)==-1)//如果栈满
            {
                if(Queue_Empty(&Queue1)==1)//队列为空
                    Queuehead = name;//更新队首名称
                Queue_Push(&Queue1, &name);//入队
                Queue_array[name] = 1;//更新
            }
            else
            {
                Stack_array[name] = 1;//更新
                Stackhead = name;
            }
            printf("\n当前栈中有%d辆车\n", StackLength(&Stack1));
            printf("当前队列中有%d辆车\n", QueueLength(&Queue1));
        }
        else if(strcmp(op, "2")==0)     //取车
        {
            printf("*****************进入取车管理子系统********************\n");
            printf("\n请输入取车车牌号:\n");
            int name;
            scanf("%d", &name);
            if(Queuehead==name)//队头是要取的车
            {
                printf("\n车辆%d可以取车\n", name);
                Queue_Pop(&Queue1);//出队
                Queue_array[name] = 0;//更新
                if(Queue_GetHead(&Queue1, &Queuehead)==-1)//更新队首
                {
                    Queuehead = -1;
                }
            }
            else if(Stackhead==name)//栈顶是要取的元素
            {
                printf("\n车辆%d可以取车\n", name);
                Stack_Pop(&Stack1);//出栈
                Stack_array[name] = 0;//更新
                if(Stack_GetTop(&Stack1, &Stackhead)==-1)//更新栈顶
                {
                    Stackhead = -1;
                }
                if(Queue_Empty(&Queue1)==0)//如果队列里面有车,入栈
                {
                    int m;
                    int k = Queue_GetHead(&Queue1, &m);//获取队头
                    if(k==1)
                    {
                        Queue_array[m] = 0;
                        Queue_Pop(&Queue1);//出队
                    }
                    if(Queue_GetHead(&Queue1, &Queuehead)==-1)//更新队首
                    {
                        Queuehead = -1;
                    }
                    if(Stack_Push(&Stack1, &m)==1)//入栈
                    {
                        Stack_array[m] = 1;//更新
                        Stackhead = m;
                    }
                }
            }
            else if(Stack_array[name]==1)//在栈里
            {
                printf("\n车辆%d可以取车\n", name);
                int ma;
                while(Stack_GetTop(&Stack1, &ma)==1)
                {
                    if(ma==name)//找到此车
                        break;
                    else//将之前的车压入栈2中
                    {
                        Stack_Push(&Stack2, &ma);
                        Stack_Pop(&Stack1);
                    }
                }
                Stack_array[name] = 0;//将车取出
                Stack_Pop(&Stack1);
                while(Stack_Empty(&Stack2)==0)//再次入栈
                {
                    int k;
                    Stack_GetTop(&Stack2, &k);
                    Stack_Push(&Stack1, &k);
                    Stack_Pop(&Stack2);
                }
                if(Queue_Empty(&Queue1)==0)//如果队列有车
                {
                    int m;
                    int k = Queue_GetHead(&Queue1, &m);//获取队首元素
                    if(k==1)
                    {
                        Queue_array[m] = 0;
                        Queue_Pop(&Queue1);//出队
                    }
                    if(Queue_GetHead(&Queue1, &Queuehead)==-1)//更新队首
                    {
                        Queuehead = -1;
                    }
                    if(Stack_Push(&Stack1, &m)==1)//入栈
                    {
                        Stack_array[m] = 1;
                        Stackhead = m;
                    }
                }
            }
            else if(Queue_array[name]==1)//在队列里面
            {
                printf("\n当前车辆%d不可取车\n", name);
            }
            else//非法指令,没有车
            {
                printf("\n当前车辆%d不存在于停车场内!\n", name);
            }
            printf("\n当前栈中有%d辆车\n", StackLength(&Stack1));
            printf("当前队列中有%d辆车\n", QueueLength(&Queue1));
        }
        else if(strcmp(op, "3")==0)//退出
        {
            printf("**************谢谢您的使用,期待下次为您服务!>3<***********\n");
            break;
        }
        else if(strcmp(op, "4")==0)//管理员
        {
            printf("*********************欢迎进入管理员界面*****************\n");
            printf("\n请输入管理员密码:\n");
            char ka[12];
            scanf("%s", ka);
            if(strcmp(ka, "123456")==0)
            {
                printf("******************管理内部信息*******************\n");
                printf("管理员菜单:\n");
                printf("           1 观看停车场内车辆信息\n");
                printf("           2 观看排队等候车辆信息\n");
                printf("           3 退出管理员系统\n");
                char cb[12];
                while(~scanf("%s", cb))
                {
                    if(strcmp(cb, "1")==0)
                    {
                        printf("\n停车场内车辆信息:\n");
                        int *tab = Stack1.top-1;//运用指针
                        while(tab!=Stack1.base-1)//输出栈内车牌号信息
                        {
                            printf("%d ", *tab);
                            tab--;
                        }
                        printf("\n");
                    }
                    else if(strcmp(cb, "2")==0)
                    {
                        printf("\n排队等候车辆信息:\n");
                        int * tab = (Queue1.front+Queue1.base);//运用指针,便利
                        while(tab!=(Queue1.rear+Queue1.base))//输出队列车牌号信息
                        {
                            printf("%d ", *tab);
                            tab++;
                        }
                        printf("\n");
                    }
                    else if(strcmp(cb, "3")==0)
                    {
                         printf("****************已退出管理员系统,辛苦!************\n");
                         break;
                    }
                    else
                    {
                        printf("\n请管理员输入正确的操作指令\n");
                    }
                }
            }
            else
            {
                printf("****************您的密码出错,自动退出管理员系统************\n");
            }
        }
        else//非法指令
        {
            printf("请输入正确的指令(例如:1, 2, 3, 4):\n");
        }
    }
    return 0;
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值