C语言使用栈和队列实现停车场管理

C语言利用栈和队列实现停车场管理

这次做的是C语言利用栈实现停车场管理–纯手打非转载
停车场管理
[问题描述]
设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。在停车场内,汽车按到达的先后次序,由北向南依次排列(假设大门在最南端)。若车场内已停满n辆车,则后来的汽车需在门外的便道上等候,当有车开走时,便道上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门后,其它车辆再按原次序返回车场。每辆车离开停车场时,应按其停留时间的长短交费(在便道上停留的时间不收费)。
[基本要求]
(1) 要求以顺序栈模拟停车场,以链队列模拟便道。
(2) 从终端读入汽车到达或离去的数据,每组数据包括三项:
①是“到达”还是“离去”;
②汽车牌照号码;
③“到达”或“离去”的时刻。
与每组输入信息相应的输出信息为:如果是到达的车辆,则输出其在停车场中或便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用。

算法思想:
1.车辆停入停车场的流程:
首先判断停车场的车位是否停满。两种情况:(1)停满时此时后来的车辆只能停在走道上
(2)未停满时后来的车辆继续入栈。
2.车辆出站的思想。两种情况:(1)车辆在栈顶时,此时直接出栈而用不到辅助栈(2)车辆不在车顶时排在前面的车辆必须让位,此时它才能出栈,算法思想是首先根据输入的车牌号进行在栈中搜索,返还一个角标,根据角标来,找到出栈的车辆,这时前面的车辆入辅助栈,当循环的目标车辆时,这时不需要入辅助栈,直接出栈即可!
总体结构思路如下
在这里插入图片描述
这时车位停满的情况,若非栈顶出栈则需要把他前面的车让位进辅助栈,当目标车出栈的再回来。

停车流程图如下:

停车流程图如下
车辆离开流程图如下
在这里插入图片描述

源代码:

#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
#include <malloc.h>
#define stackSize 3
typedef int ElementType;
//定义车辆信息的结构体
typedef struct{
   int BNo;
   int type;
   int arrivetime;
   int pushtime;
   int departuretime;
}BusInf;
//栈定义
typedef struct{
    BusInf 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;
    }
}
//判断栈满--0未满--1栈满
int IsFull(SeqStack *s)
{
    if(s->top==stackSize-1)
    {
       return 1;
    }
    else
        return 0;
}
//进站--1表示入栈--0表示栈满
int push(SeqStack *s,BusInf bus)
{
    if(IsFull(s)==1)
    {
        return 0;
    }
    else
    {
        s->top++;
        s->elem[s->top]=bus;
      return 1;
    }
}
//出栈--1表示出栈,0表示栈空--用指针带出出栈的值
int pop(SeqStack *s,BusInf *bus)
{
    if(IsEmpty(s)==1)
    {
        return 0;
    }
    else
    {
        *bus = s->elem[s->top];
        s->top--;
        return 1;
    }
}
//队列
typedef struct Node{
    BusInf Bus;
    struct Node * next;
}LinkQueueNode;
typedef struct{
    LinkQueueNode *front;//头指针
    LinkQueueNode *rear;//队尾指针
}LinkQueue;
//初始化队列--将Q初始化为一个空的链队列
int InitQueue(LinkQueue *Q)
{
    Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
    if(Q->front!=NULL)
    {
        Q->rear=Q->front;
        Q->front->next=NULL;
        Q->rear->next=NULL;
        return 1;
    }
    else return 0;
}
//入队操作
int EnterQueue(LinkQueue *Q,BusInf bus)
{
    //新建一个节点,插入队尾
    LinkQueueNode *NewNode = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
    if(NewNode!=NULL)
    {
        NewNode->Bus=bus;
        NewNode->next=NULL;
        Q->rear->next=NewNode;
        //将最后一个插入的节点设为尾结点
        Q->rear=NewNode;
        return 1;
    }
    else{
        return 0;
    }
}
//出队操作
int DeleteQueue(LinkQueue *Q,BusInf *bus){
    LinkQueueNode *p;
    if(Q->front==Q->rear){
      return 0;
    }
    else{
        p = Q->front->next;
        Q->front->next=p->next;//将对头更新
        *bus = p->Bus;
        //判断如果这个时候是否队列为空,是的话收尾指针相等
        if(Q->rear==p){
            Q->front=Q->rear;
        }
        //释放节点P
        free(p);
        return 1;
    }
}
//查找栈中有无车牌信息--temp代表出栈的位置....-1代表无车牌
int searchBusNo(SeqStack *s,BusInf bus)
{

    SeqStack *p=NULL;
    p=s;
    int temp = p->top;
    while(temp>=0)
    {
        if(p->elem[temp].BNo==bus.BNo)
            return temp;
        temp--;
    }
    return -2;
}
void showBus(SeqStack *s){
    printf("已停靠车辆:\n");
    //int temp = (s->top)+1;
     printf(" 车牌号        到达时间        停车时间\n");
     for(int temp=0;temp<=s->top;temp++)
     {
       printf(" %4d%14d%15d\n",s->elem[temp].BNo,s->elem[temp].arrivetime,s->elem[temp].pushtime);
     }
}
//显示队列里的车
void showQBus(LinkQueue *l){
    LinkQueueNode *p=l->front->next;
    printf("等待车辆:\n");
    printf(" 车牌号        到达时间\n");
    while(p!=NULL)
    {
        printf(" %4d%14d\n",p->Bus.BNo,p->Bus.arrivetime);
        p=p->next;
    }
}
int selectCar(){
    int flag=0;
    printf("1.轿车  2.客车  3.卡车  ");
    printf("\n请选择车辆种类:\n");
    scanf("%d",&flag);
    if(flag!=1 && flag!=2 &&flag!=3)
    {
        printf("输入错误重新输入:");
        scanf("%d",&flag);
    }
    return flag;
}
//输入车辆信息并且入栈或入队
void inputCarData(SeqStack *s,LinkQueue *l){
    BusInf bus;
    printf("请输入车牌号:");
    scanf("%d",&bus.BNo);
    //判断车牌号是否重复
    if(searchBusNo(s,bus)!=-2){
        printf("车牌号重复!\n");
        printf("请重新输入车牌信息:");
        scanf("%d",&bus.BNo);
    }
    printf("请输入到达时间:\n");
    scanf("%d",&bus.arrivetime);
    if(bus.arrivetime<0 || bus.arrivetime>24)
    {
        printf("时间输入不合法(0-24)重新输入:\n");
        scanf("%d",&bus.arrivetime);
    }
    bus.pushtime=bus.arrivetime;
    bus.type= selectCar();
    //车辆进栈--先判断栈是否满
    if(IsFull(s)==1){
        showBus(s);
        //栈满的情况,下面来的进队列中
        EnterQueue(l,bus);
        showQBus(l);
    }
    //栈没满的情况
    else{
     push(s,bus);
    //显示进栈车辆信息
    showBus(s);
    }
}

//离开停车位
void leaveStack(SeqStack *s,SeqStack *se,LinkQueue *Q)
{
    if(IsEmpty(s)==1)
       {
           printf("此时没有车辆停靠!");
            return;
       }
    int pay[]={2,3,4};
    int temp=0;
    int leavetime=0;
    BusInf bus;
    printf("请输入离开的车号");
    scanf("%d",&temp);
    bus.BNo=temp;
    int m = searchBusNo(s,bus);
    while(m==-2)
    {
        printf("输入错误重新输入");
        scanf("%d",&temp);
        bus.BNo=temp;
        m=searchBusNo(s,bus);
    }
    printf("请输入出栈时间:");
    scanf("%d",&leavetime);
    while(leavetime<=s->elem[m].arrivetime)
    {
        printf("离开时间必须大于停车时间!重新输入:");
        scanf("%d",&leavetime);
    }
        //显示出栈的车辆
    printf("******离去车辆信息******\n");
    printf(" 车牌号        价格         离开时间\n");
    s->elem[m].departuretime=leavetime;
    printf("%4d%13d%13d",s->elem[m].BNo,(leavetime-s->elem[m].arrivetime)*pay[s->elem[m].type-1],s->elem[m].departuretime);
    printf("\n************\n");
    //这时m接收的就是出栈的位置--2中情况在栈顶和不在栈顶--让位时进入辅助栈se
    //离开的车在栈顶时
    if(m==s->top)
    {
        BusInf *b;
        b=(BusInf*)malloc(sizeof(BusInf));
        pop(s,b);
    }
    //不在栈顶
    else
    {
     for(int i=s->top;i>=m;i--){
        BusInf *b=(BusInf*)malloc(sizeof(BusInf));
        //先入栈再出战
        if(i==m)
        {
            pop(s,b);
        }
        else{
            push(se,s->elem[i]);
            pop(s,b);
        }
    }
        for(int j=se->top;j>=0;j--)
        {
            BusInf *b=(BusInf*)malloc(sizeof(BusInf));
            pop(se,b);
            push(s,*b);
        }
    }
    //判断队列是否有等待车辆--有的话对头入栈
    if(Q->rear!=Q->front){
        BusInf *b = (BusInf*)malloc(sizeof(BusInf));
        DeleteQueue(Q,b);
        b->pushtime=leavetime;
        push(s,*b);
        showBus(s);
        showQBus(Q);
    }
    else
    showBus(s);
}
//菜单选择
int menu()
{
    char n;
    printf("\n    ************* 停车场管理系统 **************\n");
    printf("    *%15c1---停车%19c\n",' ','*');
    printf("    *%15c2---离开%19c\n",' ','*');
    printf("    *%15c3---结束程序%15c\n",' ','*');
    printf("    *******************************************\n");
    printf("菜单选择:1,2,3: ");
    do{
	     n=getch();
	     }while(n<'1' || n>'3');
     printf("\n");
     return(n-48);
}
int main()
{
    //车辆栈
    SeqStack *s =(SeqStack*)malloc(sizeof(SeqStack));
    InitStack(s);
    //车辆在路边停靠的队列
    LinkQueue *l=(LinkQueue *)malloc(sizeof(LinkQueue));
    InitQueue(l);
    //辅助栈存储让位的信息
    SeqStack *se = (SeqStack*)malloc(sizeof(SeqStack));
    InitStack(se);
    while(1)
    {
        switch(menu()){
            case 1:inputCarData(s,l);
            break;
            case 2:leaveStack(s,se,l);
            break;
            case 3:return 0;
        }
    }
    return 0;
}

  • 37
    点赞
  • 286
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
好的,下面是使用栈和队列实现停车场管理C语言代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 // 定义停车场最大容量 typedef struct { char type; // 到达/离去 int id; // 汽车牌照号码 int time; // 到达/离去的时刻 } Car; typedef struct { int top; // 顶指针 Car data[MAX_SIZE]; // 元素 } ParkStack; typedef struct { int front; // 队头指针 int rear; // 队尾指针 Car data[MAX_SIZE]; // 队列元素 } WaitQueue; int park[MAX_SIZE]; // 停车场 int park_top = -1; // 停车场顶指针 ParkStack park_stack; // 停车场 WaitQueue wait_queue; // 等待队列 // 初始化停车场 void init_park_stack() { park_stack.top = -1; } // 检查停车场是否为空 int is_park_empty() { return park_stack.top == -1; } // 检查停车场是否已满 int is_park_full() { return park_stack.top == MAX_SIZE - 1; } // 将车辆停放在停车场中 int park_car(Car car) { if (is_park_full()) { // 停车场已满,将车辆加入等待队列 if (wait_queue.rear == MAX_SIZE - 1) { // 等待队列已满,无法加入新车辆 return 0; } wait_queue.rear++; wait_queue.data[wait_queue.rear] = car; return 1; } else { // 停车场未满,将车辆停放在停车场内 park_top++; park[park_top] = car.id; park_stack.top++; park_stack.data[park_stack.top] = car; return 1; } } // 从停车场中取出车辆 int unpark_car(Car car) { int i, j, flag = 0; int time = 0; for (i = 0; i <= park_top; i++) { if (park[i] == car.id) { // 找到对应的车辆 flag = 1; time = car.time - park_stack.data[i].time; // 将车辆从停车场中移除 for (j = i; j < park_top; j++) { park[j] = park[j+1]; } park_top--; park_stack.top--; break; } } if (!flag) { // 停车场中没有找到对应的车辆,可能已经离开停车场 return 0; } else { // 计算停留时间和停车费用 int fee = time <= 2 ? 5 : (time - 2) * 3 + 5; printf("车辆 %d 在停车场内停留 %d 分钟,需缴纳停车费用 %d 元\n", car.id, time, fee); if (!is_park_empty()) { // 停车场不为空,将等待队列中的车辆加入停车场 Car next_car = wait_queue.data[wait_queue.front+1]; park_car(next_car); wait_queue.front++; wait_queue.rear--; } return 1; } } // 主函数 int main() { // 初始化停车场和等待队列 init_park_stack(); wait_queue.front = 0; wait_queue.rear = -1; // 输入车辆信息 printf("请输入车辆信息(格式:到达/离去,汽车牌照号码,到达/离去的时刻),输入 E 0 0 结束输入:\n"); char type; int id, time; while (1) { scanf("%c %d %d", &type, &id, &time); getchar(); // 读取输入缓冲区的回车符 if (type == 'E' && id == 0 && time == 0) { break; } Car car = {type, id, time}; if (type == 'A') { // 汽车到达,尝试将车辆停放在停车场中 if (!park_car(car)) { printf("停车场已满,车辆 %d 无法停放\n", car.id); } else { printf("车辆 %d 停放在停车场中\n", car.id); } } else if (type == 'D') { // 汽车离开,尝试将车辆从停车场中移除 if (!unpark_car(car)) { printf("车辆 %d 不在停车场中\n", car.id); } } } return 0; } ``` 注意,上述代码中使用了两个全局变量 `park` 和 `park_top` 来表示停车场,这不是一个很好的实现方式,更好的实现方式是将停车场用一个来表示。在上述代码的基础上,你可以尝试使用实现停车场,以提高代码的可读性和可维护性。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值