#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;
}
停车的管理系统
最新推荐文章于 2024-04-29 17:10:42 发布