/**
*    实验题目:
*        停车场管理程序
*    实验目的:
*        深入掌握栈和队列应用的算法设计
*    实验内容:
*        设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
*    汽车在停车场内按车辆到达时间的先后顺序,依次由南向北排列(大门在最北端,最
*    先到达的第一辆车停放在车场的最南端),若车场内已停满n辆车,则后来的汽车只能
*    在门外的便道即候车场上等候,一旦有车开走,则排在便道上的第一辆车即可开入;
*    当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车
*    开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时
*    必须按它停留的时间长短交纳费用。
*    用栈模拟停车场,用队列模拟车场外的便道,按照从键盘获候车场中的车辆:104取的数据序列进行模拟管理。
*    每一组输入数据包括3个数据项:汽车到达(1)或者离开(2)、汽车牌照号码以及到达或者
*    离开的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车
*    在停车场内或便道上的停车位置;若是车辆离开,则输出汽车在停车场内停留的时间和
*    应交纳的费用(在便道上停留的时间不收费)。注意:栈采用顺序存储结构,队列采用环形
*    队列。
*        还需设一个临时栈,用于临时停放为要给离开的汽车让路而从停车场退出来的汽车,
*    也用顺序结构实现。
*    用户输入的命令有以下5种:
*    1、汽车到达
*    2、汽车离开
*    3、输出停车场中的所有汽车牌号
*    4、输出候车场中的所有汽车牌号
*    5、退出系统
*/

#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>

#define N 3 // 停车场内最多的停车数
#define M 4 // 候车场内最多的停车数入队
#define PRICE 2 // 每单位停车费用

/*---------------------停车场:栈采用顺序存储结构--------------------*/
typedef struct
{
    int car_no[N]; // 车牌号
    int car_time[N]; // 进场时间
    int top; // 栈顶指针
}SqStack; // 声明顺序栈类型

/*------------------------候车场:队列采用环形队列-------------------*/
typedef struct
{
    int car_no[M]; // 车牌号
    int que_front; // 队头指针
    int que_rear; // 队尾指针
}SqQueue; // 声明环形队列类型

/*------------------------栈的运算算法-------------------*/
/*------------------------初始化栈-------------------*/
static void init_stack(SqStack *&s) // 指针的引用
{
    s = (SqStack *)malloc(sizeof(SqStack)); // 动态分配存储空间
    s->top = -1;
}

/*------------------------判断栈空-------------------*/
static bool stack_empty(SqStack *s)
{
    return (s->top == -1);
}

/*------------------------判断栈满-------------------*/
static bool stack_full(SqStack *s)
{
    return (s->top == N - 1);
}

/*------------------------压栈-------------------*/
static bool push(SqStack *&s, int car_no, int car_time)
{
    if(s->top == N - 1) // 栈满的情况
        return false;

s->top++;
    s->car_no[s->top] = car_no; // 车牌号
    s->car_time[s->top] = car_time; // 进场时间

return true;
}

/*------------------------出栈-------------------*/
static bool pop(SqStack *&s, int &car_no, int &car_time) // 指针的引用
{
    if(s->top == -1) // 栈空的情况
        return false;

car_no = s->car_no[s->top]; // 提取车牌号
    car_time = s->car_time[s->top]; // 提取进场时间
    s->top--;

return true;
}

/*------------------------显示栈中元素-------------------*/
static void display_stack(SqStack *s)
{
    int i;

for(i = s->top; i >= 0; i--)
        printf("%d ", s->car_no[i]);

printf("\n");
}

/*------------------------队列的运算算法-------------------*/
/*------------------------初始化队列-------------------*/
static void init_queue(SqQueue *&q) // 指针的引用
{
    q = (SqQueue *)malloc(sizeof(SqQueue)); // 动态分配存储空间
    q->que_front = q->que_front = 0;
}

/*------------------------判断队列空-------------------*/
static bool queue_empty(SqQueue *q)
{
    return (q->que_front == q->que_rear);
}

/*------------------------判断队列满-------------------*/
static bool queue_full(SqQueue *q)
{
    return ((q->que_rear + 1) % M == q->que_front);
}

/*------------------------入队操作-------------------*/
static bool en_queue(SqQueue *&q, int car_no)
{
    if((q->que_rear + 1) % M == q->que_front) // 队满
        return false;

q->que_rear = (q->que_rear + 1) % M; // 计算队尾指针
    q->car_no[q->que_rear] = car_no;

return true;
}

/*------------------------出队操作-------------------*/
static bool de_queue(SqQueue *&q, int &car_no)
{
    if(q->que_front == q->que_rear) // 队空的情况
        return false;

q->que_front = (q->que_front + 1) % M; // 计算队头指针
    car_no = q->car_no[q->que_front]; // 提取车牌号

return true;
}

/*------------------------显示队列中元素-------------------*/
static void display_queue(SqQueue *q)
{
    int i;

i = (q->que_front + 1) % M;
    printf("%d ", q->car_no[i]);
    while((q->que_rear - i + M) % M > 0)
    {
        i = (i + 1) % M;
        printf("%d ", q->car_no[i]);
    }

printf("\n");
}

int main(void)
{
    int command; // 输入的命令
    int i, j; // 循环变量
    int e1, e2;
    int car_no; // 车牌号
    int car_time; // 到达时间
    SqStack *st; // 停车场栈
    SqStack *tmp_st; // 临时栈
    SqQueue *qu; // 候车场队列

init_stack(st);
    init_stack(tmp_st);
    init_queue(qu);
    do
    {
        printf(">输入命令(1:到达 2:离开 3:停车场 4:候车场 0:退出):");
        scanf("%d", &command);
        switch(command)
        {
        case 1: // 汽车到达
            printf("   车牌号  到达时间:");
            scanf("%d %d", &car_no, &car_time);
            if(!stack_full(st)) // 停车场不满
            {
                push(st, car_no, car_time);
                printf("  停车场位置:%d\n", st->top + 1);
            }
            else // 停车场满
            {
                if(!queue_full(qu)) // 候车场不满
                {
                    en_queue(qu, car_no);
                    printf("  候车场位置:%d\n", qu->que_rear);
                }
                else
                    printf("  候车场已满,不能停车\n");
            }
            break;
        case 2: // 汽车离开
            printf("   车牌号  离开时间:");
            scanf("%d %d", &car_no, &car_time);
            for(i = 0; i <= st->top && st->car_no[i] != car_no; i++);
            if(i > st->top)
                printf("  未找到该编号的汽车\n");
            else
            {
                for(j = i; j <= st->top; j++)
                {
                    pop(st, e1, e2);
                    push(tmp_st, e1, e2); // 倒车到临时栈tmp_st中
                }
                pop(st, e1, e2); //该汽车离开
                printf("  %d汽车停车费用:%d\n", car_no, (car_time - e2) * PRICE);
                while(!stack_empty(tmp_st)) // 将临时栈tmp_st重新回到st中
                {
                    pop(tmp_st, e1, e2);
                    push(st, e1, e2);
                }
                if(!queue_empty(qu)) // 队不空时,将队头进栈st
                {
                    de_queue(qu, e1);
                    push(st, e1, car_time); // 以当前时间开始计费
                }
            }
            break;
        case 3: // 显示停车场情况
            if(!stack_empty(st))
            {
                printf("  停车场中的车辆:"); // 输出停车场中的车辆
                display_stack(st);
            }
            else
                printf("  停车场中无车辆\n");
            break;
        case 4: // 显示候车场情况
            if(!queue_empty(qu))
            {
                printf("  候车场中的车辆:"); // 输出候车场中的车辆
                display_queue(qu);
            }
            else
                printf("  候车场中无车辆\n");
            break;
        case 0: // 退出
            if(!stack_empty(st))
            {
                printf("  停车场中的车辆:"); // 输出停车场中的车辆
                display_stack(st);
            }
            if(!queue_empty(qu))
            {
                printf("  候车场中的车辆:"); // 输出候车场中的车辆
                display_queue(qu);
            }
            break;
        default: // 其它情况
            printf("   输入的命令错误\n");
            break;
        }
    }while(command != 0);

return 0;
}
测试结果:

>输入命令(1:到达 2:离开 3:停车场 4:候车场 0:退出):1
   车牌号  到达时间:101 1
  停车场位置:1
>输入命令(1:到达 2:离开 3:停车场 4:候车场 0:退出):1
   车牌号  到达时间:102 2
  停车场位置:2
>输入命令(1:到达 2:离开 3:停车场 4:候车场 0:退出):1
   车牌号  到达时间:103 3
  停车场位置:3
>输入命令(1:到达 2:离开 3:停车场 4:候车场 0:退出):1
   车牌号  到达时间:104 4
  候车场位置:1
>输入命令(1:到达 2:离开 3:停车场 4:候车场 0:退出):3
  停车场中的车辆:103 102 101
>输入命令(1:到达 2:离开 3:停车场 4:候车场 0:退出):4
  候车场中的车辆:104
>输入命令(1:到达 2:离开 3:停车场 4:候车场 0:退出):2
   车牌号  离开时间:101 6
  101汽车停车费用:10
>输入命令(1:到达 2:离开 3:停车场 4:候车场 0:退出):3
  停车场中的车辆:104 103 102
>输入命令(1:到达 2:离开 3:停车场 4:候车场 0:退出):0
  停车场中的车辆:104 103 102

综合性实验:停车场管理程序相关推荐

  1. c语言综合性实验数字益智游戏排行榜,C语言综合性实验报告1.doc

    C语言综合性实验报告1.doc 华北科技学院计算机系综合性实验 实 验 报 告 课程名称 C程序设计 实验学期 至 学年 第 学期 学生所在系部 年级 专业班级 学生姓名 学号 任课教师 实验成绩 计 ...

  2. 计算机文献检索综合性实验报告,文献检索综合性实验报告模板.doc

    文献检索综合性实验报告模板 文献检索综合性实验报告 实验名称:文献综述课题多数据库检索 实验性质:综合性实验 实验学时:4 所属课程:文献检索 开设时间:2009年秋 授课班级:06动医1, 2, 3 ...

  3. 华北科技学院计算机系综合性实验,华北科技学院计算机系综合性实验.doc

    华北科技学院计算机系综合性实验.doc 华北科技学院安全工程学院综合性 实 验 报 告 课程名称 程序设计语言(VB) 实验学期 2011 至 2012 学年 第 2 学期 学生所在系部 安全工程学院 ...

  4. python综合实验报告_Python程序设计实验报告五:综合运用三种基本结构进行程序设计(综合性实验)...

    安徽工程大学 Python程序设计 实验报告 班级 物流191 姓名姚彩琴学号3190505129 成绩 日期 2020.4.22 指导老师修宇 [实验名称]综合运用三种基本结构进行程序设计(综合性实 ...

  5. 计算机硬件密码,计算机硬件技术基础综合性实验任务书(08)密码门锁的模拟_C

    11 计算机硬件技术基础课程设计任务书编号:8 河北工业大学计算机硬件技术基础(MCS-51单片机原理及应用) 综合性实验任务书 学院班级设计人成绩 一.题目:用单片机模拟密码门锁 二.目的与要求: ...

  6. c语言综合性程序设计,《C语言程序设计》综合性实验报告撰写格式

    报告撰写格式说明 综合性实验完成以后,要求写出实验报告,并将报告电子版上交.具体要求如下: 一.使用A4页面,页面设置采用WORD默认设置. 二.正文使用宋体5号字,一级标题宋体4号字加粗,二级标题宋 ...

  7. 华南农业大学汇编语言综合性实验-将自己的姓名用多种颜色动态显示

    题目名称 综合性实验-将自己的姓名用多种颜色动态显示 题目关键字 综合性实验 华南农业大学综合性.设计性实验报告 实验项目名称: 汇编语言综合设计 实验项目性质: 综合性.设计性实验 所属课程名称: ...

  8. c语言程序设计综合性设计实验报告,《C语言程序设计》-综合性实验实验报告(参考格式...

    <<C语言程序设计>-综合性实验实验报告(参考格式>由会员分享,可在线阅读,更多相关<<C语言程序设计>-综合性实验实验报告(参考格式(9页珍藏版)>请 ...

  9. 《网络基础》课程综合性实验(pkt文件请见我的资源)

    <网络基础>课程综合性实验要求 项目源文件点击下面连接下载: https://download.csdn.net/download/weixin_43372169/19780294?spm ...

最新文章

  1. 压缩机html200a功率,汽车空调功率有多大?如果用电瓶充电器供电能行吗?
  2. 【转】指针和引用的区别
  3. 记录hive sql报错,return code1和return code2解决方法
  4. c#.net中创建带图标的ListBox
  5. (21)System Verilog设计D触发器
  6. 炫彩渐变流体元素PSD分层海报模板,耍酷就选它做背景!
  7. html5transform变形,transform-function
  8. hadoop 权威指南学习笔记ing(1)
  9. C#中List的排序(Sort)
  10. linux 查看当前表空间大小,查看表空间和表的使用率
  11. 基于改进的残差网络的指纹识别算法
  12. 台式计算机配置清单及价格,电脑主机配置清单及价格(台式组装机电脑配置清单)...
  13. 还原数据库SQL语句
  14. 熊猫猪新系统测试之三:iOS 8.0.2
  15. 『DL笔记』预训练(pre-training/trained)与微调(fine tuning)
  16. 未注册域名批量查询工具
  17. 半导体车间净化工程的空气洁净度划分等级
  18. 近一个月总结(鸡汤多于技术)
  19. 时间序列预测框架--Darts--快速开始(下)
  20. android手机分辨率适配,Android屏幕适配(一)

热门文章

  1. html写注册协议页面,注册页面编写(html/css)
  2. 有没有好用的工作便签提醒软件能在电脑桌面显示内容提醒的?
  3. 前端 i 标签 倾斜如何去除
  4. 夜光 嘿哈~~情人节快乐(愿天下有情人终成眷属)
  5. 第二章 基本数据结构
  6. 编译器扩展-ScriptableWizard
  7. 我不杀伯仁,伯仁却因我而死
  8. Json与CJson详解
  9. width,height为多少px时,A4纸打印时刚好一页?(转载)
  10. 樊登读书会2018年推荐书目汇总