数据结构---渡口管理

制作背景:课程小作业

修改日期:2022/10/9

编译环境:vscode

作者:二本双非21级小白

/* 
    渡口系统
    创建三个队列----货车/客车/渡轮
    过江渡船每次能载十辆车过江
    每上四辆客车才能上一辆货车
    如果客车不足四辆,货车补上
    没有货车,客车补上
 */

知识背景

  1. 了解顺序表和链表的基本操作,队列:先进先出
  2. 留出一个数据空间,利用头尾指针通过 "(Q.rear+1)%Qmaxsize==Q.front" 来判断队满
  3. 利用 "Q.front=(Q.front+1)%Qmaxsize" 来实现加一下移并在到达上限后,归零重置,实现循环,解决假上溢问题

1、头文件宏定义


#include <iostream>
using namespace std;

//顺序循环队列

#define Qmaxsize 20    //流出一个数据空间不写入数据
#define OK 1
#define TRUE 1
#define ERROR 0
#define FALSE 0
#define OVERFLOW -2
typedef  char QElemType;
typedef  int Status;


2、结构类型和函数声明

typedef struct 
{
    QElemType *base;//初始化的动态内存空间
    int front;      //存储对头元素的下标
    int rear;       //存储对尾元素的下标
    int num;        //元素个数
}SqQueue;
//SqQueue后面没有带'*'号,既属于普通类型调用时需要用'.'而不是特殊类型使用的'->'

//基础函数
Status InitQueue(SqQueue &Q);
int QueueLength(SqQueue Q);
Status DeQueue(SqQueue &Q,QElemType &e);
Status EnQueue(SqQueue &Q,QElemType e);
QElemType GetHead(SqQueue Q);
//功能函数
Status Swap_bus(SqQueue &bus,SqQueue &boat);
Status Swap_truck(SqQueue &truck,SqQueue &boat);
Status cout_queue(SqQueue &Q);

/* 
    渡口系统
    创建三个队列----货车/客车/渡轮
    过江渡船每次能载十辆车过江
    每上四辆客车才能上一辆货车
    如果客车不足四辆,货车补上
    没有货车,客车补上
 */

3、主函数



int main (void)
{
    //初始化三个循环顺序队
    SqQueue bus,truck,boat;
    InitQueue (bus);
    InitQueue (truck);
    InitQueue (boat);
    QElemType m;

    -----临时的测试数据
    for(int i=0; i<11; i++)
        EnQueue(bus,'*');
    for(int j=0; j<11; j++)
        EnQueue(truck,'#');
    ///
    cout<<"初始客车数量:";            cout_queue(bus);
    cout<<"初始货车数量:";            cout_queue(truck);

    int count=0;
    while((bus.num!=0)||(truck.num!=0))
    {
        //十辆车来回一趟
        while(boat.num<10){
            Swap_bus(bus,boat);
            Swap_truck(truck,boat);
            if((bus.num==0)&&(truck.num==0))
                break;
        }
        count++;
        cout<<"第"<<count<<"班"<<endl;
        if(bus.num!=0)      cout<<"剩余客车数量:";            
        cout_queue(bus);
        if(truck.num!=0)    cout<<"剩余客车数量:";            
        cout_queue(truck);
        cout<<"渡轮上的车辆顺序:";        
        cout_queue(boat);
        for(int i=0;i<10;i++)
            DeQueue(boat,m);        //清空渡轮
    }
        
    cout<<"等候排队"<<endl;
    system("pause");
    return 0;
}

4、功能函数

Status cout_queue(SqQueue &Q)
{
    if(Q.front==Q.rear)  return ERROR;//判断队列是否为空//判断队列是否为满 
    int temp=Q.front;
    for(int i=0;i<Q.num;i++){
        cout<<Q.base[Q.front];             //输出对头元素
        Q.front=(Q.front+1)%Qmaxsize;       //对头指针下移
    }
    Q.front=temp;           //对头指针回正
    cout<<endl;
    return OK;
}

Status Swap_truck(SqQueue &truck,SqQueue &boat)
{
    QElemType e;
    if(truck.num>0){        //有货车
        if(boat.num<10){        //渡轮未满时
            DeQueue(truck,e);         //删出货车队头元素,并保存
            EnQueue(boat,e);        //将保存的元素插入渡口队尾
        }
        else{
            cout<<"渡轮已满"<<endl;
            return ERROR;
        }
        return OK;
    }     
    return OK;
}


//将一个队列的前四个元素转移到另一个队列
Status Swap_bus(SqQueue &bus,SqQueue &boat)
{
    QElemType e;
    if(bus.num>=4){             //当客车大于4辆车时
        for(int i=0;i<4;i++){
            if(boat.num<10){        //渡轮未满时
                DeQueue(bus,e);         //删出客车队头元素,并保存
                EnQueue(boat,e);        //将保存的元素插入渡口队尾
            }
            else{
                cout<<"渡轮已满"<<endl;
                return ERROR;
            }
        }
        return OK;
    }
    else{                       //客车数量小于4
        for(int j=bus.num;j>0;j--){         
            if(boat.num<10){
                DeQueue(bus,e);
                EnQueue(boat,e);  
            }
            else{
                cout<<"渡轮已满"<<endl;
                return ERROR;
            }
        }
        return OK;
    }
}

 5、功能函数

//队列的初始化
Status InitQueue(SqQueue &Q)
{
    Q.base=new QElemType[Qmaxsize]; //为数组分配空间
    if(!Q.base)     exit(OVERFLOW); //没有内存空间分配失败
    Q.front=0;
    Q.rear=0;
    Q.num=0;
    return OK;
}

//求队列的长度
int QueueLength(SqQueue Q)
{
    Q.num=(Q.rear-Q.front+Qmaxsize)%Qmaxsize;
    return Q.num;
    //利用模将Q.rear-Q.front进行绝对值
}

//出队-----删除元素
Status DeQueue(SqQueue &Q,QElemType &e)
{
    if(Q.front==Q.rear)  return ERROR;//判断队列是否为空
    e=Q.base[Q.front];              //保存对头元素
    Q.front=(Q.front+1)%Qmaxsize;
    Q.num--;
    return  OK;
}


//入队-----插入元素---解决假上溢问题
Status EnQueue(SqQueue &Q,QElemType e)
{
    if((Q.rear+1)%Qmaxsize==Q.front)    return ERROR;//判断队列是否为满  
    Q.base[Q.rear]=e;           //新元素插入队尾
    Q.rear=(Q.rear+1)%Qmaxsize; //队尾坐标加一
    Q.num++;
    return OK;
}

//取队头元素
QElemType GetHead(SqQueue Q)
{
    if(Q.front!=Q.rear)     //队列不为空
        return Q.base[Q.front];     //返回队头元素的值
    return ERROR;
}

6、编译结果

 

 

遇到的难点:

㈠ 在循环顺序列中,如何实现从头指针front开始打印出指定个数和顺序的元素表,参考函数               Status cout_queue(SqQueue &Q);

㈡ 在处理客车与渡轮队列时,如何实现不同情况的判断区分并顺利实现对应的循环,参考函数          Status Swap_bus(SqQueue &bus,SqQueue &boat);

㈢ 在主函数中,如何确定循环结束的条件,并将所有有效结果打印出来,方便后续调试

特别鸣谢,青岛大学王卓老师的课程指导。

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 模拟渡口数据结构设计可以考虑以下几个方面: 1. 船只信息:需要记录船只的名称、载重、航行速度等基本信息。可以使用结构体来表示船只,例如: ```c typedef struct { char name[20]; // 船只名称 int capacity; // 载重 float speed; // 航行速度 } Ship; ``` 2. 港口信息:需要记录港口的名称、位置、当前可用的船只等信息。可以使用结构体来表示港口,例如: ```c typedef struct { char name[20]; // 港口名称 float longitude; // 经度 float latitude; // 纬度 int num_of_ships; // 当前可用船只数量 Ship ships[MAX_SHIPS]; // 当前可用船只列表 } Port; ``` 3. 渡口队列:需要记录等待渡船的车辆信息,包括车牌号、车型、乘客数量等。可以使用链表来表示渡口队列,例如: ```c typedef struct passenger { char name[20]; // 乘客姓名 int age; // 乘客年龄 struct passenger *next; // 指向下一个乘客节点的指针 } Passenger; typedef struct vehicle { char license_plate[10]; // 车牌号 char type[20]; // 车型 int num_of_passengers; // 乘客数量 Passenger *passengers; // 乘客列表 struct vehicle *next; // 指向下一辆车的指针 } Vehicle; typedef struct { int num_of_vehicles; // 队列长度 Vehicle *head; // 指向队列首部的指针 Vehicle *tail; // 指向队列尾部的指针 } Queue; ``` 通过以上数据结构的设计,可以实现对港口、船只和渡口队列等信息的记录和管理,从而实现模拟渡口的功能。 ### 回答2: 模拟渡口是指利用计算机技术来模拟船只在渡口的运输过程,它可以用于研究渡口的运作效率、优化渡口的排队和调度算法等。对于模拟渡口数据结构设计,可以考虑以下几个方面: 1. 船只的信息管理:每艘船可以定义为一个船只对象,包含船只的唯一标识符、类型、名称、载重量等属性。可以使用队列或链表来管理船只的排队顺序,新到达的船只加入队列尾部。 2. 渡口的状态管理渡口的状态包括两个方面,即船只的停靠状态和渡口的通行状态。可以使用布尔变量来表示某个船只是否停靠在渡口,如果某个船只正停靠在渡口,其他船只需等待。通行状态可以使用布尔变量来表示,可以定义为开放或关闭,以控制船只的进出。 3. 船只的操作和排队策略:船只可以执行进港、出港、停泊等操作,可以在船只对象中定义相应的方法进行操作。排队策略可以依据船只的类型、载重量等条件进行优化,比如将载重量较大的船优先进港,可以使用优先队列或者比较函数来实现。 4. 船只的等待时间和通过时间统计:可以使用计时器来记录船只等待的时间和通过渡口的时间,结合队列或链表的长度来计算平均等待时间和通行时间,以评估渡口的运作效率。 总之,模拟渡口数据结构设计需要考虑船只和渡口的状态管理、船只的操作和排队策略,以及统计船只的等待时间和通过时间等。合理设计数据结构可以实现对渡口运作过程的模拟和优化。 ### 回答3: 模拟渡口数据结构的设计需要考虑到船只的进出渡口、排队等待的顺序以及各个船只的信息记录。 首先,我们可以设计一个船只类(Boat),其中包含船只的属性,比如船只的编号、大小、载重量等信息。每个船只都可以通过进入渡口(enterDock)和离开渡口(exitDock)的方法进行操作。 然后,我们可以设计一个渡口类(Dock),其中包含渡口的属性,比如渡口的容量、当前已经停靠的船只数量等信息。渡口类还需要具备以下方法: 1. 入港(enterDock):将一艘船只加入渡口等待的队列中,若渡口已满,则船只需要等待; 2. 出港(exitDock):将当前在渡口中的船只出港,出港后的空位可以被新的船只占用; 3. 获取当前渡口中的船只队列(getBoatQueue):返回当前在渡口中等待的船只队列,用于给用户展示当前等待的船只信息; 4. 获取渡口是否已满(isFull):判断当前渡口是否已经满员,若满员则需要等待船只离开才能进港; 5. 获取渡口当前的船只数量(getBoatCount):返回当前在渡口中的船只数量; 最后,我们可以设计一个渡口管理类(DockManager),用于管理多个渡口实例。渡口管理类可以提供以下方法: 1. 增加渡口(addDock):向渡口管理类中添加一个新的渡口实例; 2. 移除渡口(removeDock):从渡口管理类中移除指定的渡口实例; 3. 获取所有渡口的信息(getAllDockInfo):返回所有渡口的当前状态,包括渡口编号、容量、当前船只数量等信息; 以上是一个基本的模拟渡口数据结构设计的思路,具体实现可以根据需求和实际情况进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值