当前位置: 首页 > news >正文

第2章第2节练习题3 使用队列模拟渡口管理

问题描写叙述

汽车轮渡口,过江渡船每次能载10辆车过江。过江车分为客车和货车类。上渡船有例如以下规定:

1).同类车先到先上船。
2).客车先于货车上渡船,其每上4辆客车,才同意放上一辆货车;
3).若等待客车不足4辆。则以货车取代;
4).若无货车等待,同意客车都上船。

试设计一个算法模拟渡口管理

算法思想

经过分析,发现此题实际上就是队列的基本操作,唯一的不同就是在入队的时候,对于顺序进行了限制。

  • 使用队列Q表示每次载渡的车辆,队列Qp表示客车。Qt表示货车队列;
  • 假设Qp中元素足够。则每从队列Qp中出队4个元素。从队列Qt中出队1元素,直到队列Q的长度为10;
  • 若队列Qp中元素不充分。则直接使用队列Qt中的元素补齐。

算法描写叙述

void manager(){
    if(IsEmpty(&Qp)!=0&&car<4){
        DeQueue(&Qp,&e);
        EnQueue(&Q,e);
        car++;
        count++;
    }else if(car==4&&IsEmpty(&Qt)!=0){
        DeQueue(&Qt,&e);
        EnQueue(&Q,e);
        car=0;
        count++;
    }else{
        while(count<=MaxSize&&IsEmpty(&Qt)!=0){
            DeQueue(&Qt,&e);
            EnQueue(&Q,e);
            count++;
        }
    }
    if(IsEmpty(&Qt)==0&&IsEmpty(&Qp)==0){
        count=11;
    }
}

详细代码见附件。


附件

#include<stdio.h>
#define MaxSize 10

typedef char ElemType;
typedef struct{
    ElemType data[MaxSize];
    int front, rear;
}SqQueue;

void InitQueue(SqQueue*);
void EnQueue(SqQueue*, ElemType);
void DeQueue(SqQueue*, ElemType*);
int IsEmpty(SqQueue*);
void Mangager(SqQueue*, SqQueue*, SqQueue*);
void PrintQueue(SqQueue);

int main(int argc,char* argv[])
{
    SqQueue Q;
    SqQueue Qp;//客车
    SqQueue Qt;//货车

    InitQueue(&Q);
    InitQueue(&Qp);
    InitQueue(&Qt);

    ElemType x='P';
    for(int i=0;i<6;i++){
        EnQueue(&Qp,x);
    }   
    ElemType y='T';
    for(int i=0;i<6;i++){
        EnQueue(&Qt,y);
    }

    int count=0;
    int car=0;
    ElemType e;

    //渡口模拟
    while(count<=MaxSize){
        if(IsEmpty(&Qp)!=0&&car<4){
            DeQueue(&Qp,&e);
            EnQueue(&Q,e);
            car++;
            count++;
        }else if(car==4&&IsEmpty(&Qt)!=0){
            DeQueue(&Qt,&e);
            EnQueue(&Q,e);
            car=0;
            count++;
        }
        else{
            while(count<=MaxSize&&IsEmpty(&Qt)!=0){
                DeQueue(&Qt,&e);
                EnQueue(&Q,e);
                count++;
            }
        }
        if(IsEmpty(&Qt)==0&&IsEmpty(&Qp)==0)
        {
            count=11;
        }
    }

    PrintQueue(Q);

    return 0;
}

/*---------------------------------------------------------------*/

void InitQueue(SqQueue* Q)
{
    Q->front=0;
    Q->rear=0;
}

void EnQueue(SqQueue* Q, ElemType x)
{
    if(Q->rear==MaxSize-1){
        return;
    }
    Q->data[Q->rear++]=x;
}

void DeQueue(SqQueue* Q, ElemType *x)
{
    if(Q->front==Q->rear&&Q->front==0){
        return;
    }
    *x=Q->data[Q->front++];
}

int IsEmpty(SqQueue* Q)
{
    if(Q->front==Q->rear){
        return 0;
    }else{
        return -1;
    }
}

void PrintQueue(SqQueue Q)
{
    while(Q.front!=Q.rear){
        printf("%4c",Q.data[Q.front++]);
    }
    printf("\n");
}

相关文章:

  • Zookeeper客户端Curator---Getting Started
  • [Step By Step]SAP HANA创建属性视图(Attribute View)
  • 如何在Linux上检测硬盘上的坏道和坏块
  • Linux高速下载工具——Axel
  • 低功耗M2M市场广阔 芯片设计如何降耗
  • 3.垃圾回收器
  • Debian下无root权限使用Python访问Oracle
  • bzoj 1860: [Zjoi2006]Mahjong麻将 题解
  • git使用点滴:如何查看commit的内容和git 获取最近一次提交的commit id
  • 美光Sun合作长寿命SLC闪存 100万次写入
  • OCZ新Summit系列固态硬盘强悍性能曝光
  • 用MAID 2.0降低存储费用
  • 为什么要创建开放源码的PlayScala社区?
  • 关于 TCP/IP,必知必会的十个问题
  • OSStatus code 查询
  • 【React系列】如何构建React应用程序
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • isset在php5.6-和php7.0+的一些差异
  • Meteor的表单提交:Form
  • React 快速上手 - 07 前端路由 react-router
  • socket.io+express实现聊天室的思考(三)
  • Vue2 SSR 的优化之旅
  • Web设计流程优化:网页效果图设计新思路
  • 番外篇1:在Windows环境下安装JDK
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 我建了一个叫Hello World的项目
  • 在electron中实现跨域请求,无需更改服务器端设置
  • Nginx实现动静分离
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 我们雇佣了一只大猴子...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ${ }的特别功能
  • (007)XHTML文档之标题——h1~h6
  • (7)STL算法之交换赋值
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)UDP基本编程步骤
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • .Net - 类的介绍
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core 版本不支持的问题
  • .net 调用php,php 调用.net com组件 --
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET性能优化(文摘)
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .sh 的运行
  • // an array of int
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945