利用队列实现车厢编组(数据结构)

一、实验内容

利用队列实现车厢编组问题。假设队列元素是char类型,‘H’表示硬座,‘S’表示软卧,队列A表示一组硬座和卧铺混编的车厢。要求把队列A中的硬座车厢移动到队列B,队列A中的卧铺车厢移动到队列C,同时保留原有硬座车厢之间和软卧车厢之间的先后顺序不变。如HSHHSHSSHH,分别输出软卧车组:SSSS和硬座车组:HHHHHH。

二、源代码

#include<stdio.h>

#include<stdlib.h>

#define MAXQSIZE 8

typedef char elemtype;

typedef struct

{

    elemtype* base;//存储空间

    int front; //头指针

    int rear; //尾指针

    int maxsize; //队列的容量

}sqqueue;

int initqueue(sqqueue& q)//构造空队列

{

    q.base = (elemtype*)malloc(MAXQSIZE * sizeof(elemtype));

    q.front = 0;

    q.rear = 0;

    q.maxsize = MAXQSIZE;

    return 1;

}

int queueempty(sqqueue q)//判断队列是否为空

{

    if (q.rear == q.front)

        return 1;

    else return 0;

}

int enqueue(sqqueue& q, elemtype e)//入队函数

{

    if ((q.rear + 1) % MAXQSIZE == q.front)

        return 0;

    q.base[q.rear] = e;//插入到队尾

    q.rear = (q.rear + 1) % MAXQSIZE;

    return 1;

}

int dequeue(sqqueue& q, elemtype& e)//出队

{

    if (q.front == q.rear)

        return 0;

    e = q.base[q.front];

    q.front = (q.front + 1) % MAXQSIZE;

    return 1;

}

void output(sqqueue q)

{

    elemtype e;

    if (queueempty(q)==1)

    {

        printf("队空,不能输出");

    }

    else

    {

        while (queueempty(q) == 0)

        {

             dequeue(q, e);

             printf("%2c", e);

        }

        printf("\n");

    }

}

void arrange(sqqueue a, sqqueue& b, sqqueue& c)

{

    elemtype e;

    initqueue(b); //创建空队列B和C

    initqueue(c);

    while (queueempty(a) == 0) //将A中的元素按规则分别放入B和C中

    {

        dequeue(a, e);

        if (e == 'H') enqueue(b, e);

        else if (e == 'S') enqueue(c, e);

    }

}

int main()

{

    sqqueue a, b, c;

    elemtype e;

    initqueue(a);

    printf("请输入S和H的组合车组\n");

    scanf_s("%c", &e);

    while (e != '\n')

    {

        enqueue(a, e);

        scanf_s("%c", &e);

    }

    output(a);

    arrange(a, b, c);

    printf("硬座车组:");

    output(b);

    printf("软座车组:");

    output(c);

    return 0;

}

三、运行结果

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值