火车调度问题-C语言实现详解

1,064 阅读3分钟

封面8 拷贝.png

作者:老九—技术大黍

产品:查看原文

社交:CSDN

公众号:老九学堂(新手有福利)

特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系笔者授权

问题描述

某火车调度站的铁道联接结构如图所示:

image-20210323112842204.png

其中,A为入口,B为出口,S为中转盲端。所有铁道均为单轨单向式:火车行驶的方向只能是从A到S,再从S到B;另外,不允许超车。因为车厢可在S中驻留,所以它们从B端驶出的次序,可能与从A端驶入的次序不同。不过S的容量有限,同时驻留的车厢不得超过m节。

设某列车由编号依次为{1, 2, …, n}的n节车厢组成。调度员希望知道,按照以上交通规则,这些车厢能否以{a1, a2, …, an}的次序,重新排列后从B端驶出。如果可行,应该以怎样的次序操作?

image-20210323113630377.png

输入

共两行。

第一行为两个整数n,m。

第二行为以空格分隔的n个整数,保证为{1, 2, …, n}的一个排列,表示待判断可行性的驶出序列{a1,a2,…,an}。

输出

若驶出序列可行,则输出操作序列,其中push表示车厢从A进入S,pop表示车厢从S进入B,每个操作占一行。

若不可行,则输出No。

样例

Input

image-20210323113728112.png

Output

image-20210323113735674.png

代码实现

定义顺序栈结构

#include "stdio.h"
#include "stdlib.h"
#define MAX_SIZE 255    //数组最大长度
//顺序栈结构
typedef struct sqStack
{
    int elems[MAX_SIZE];
    int top; //栈顶,数组下标
    int length; //栈的长度
}SqStack;

void init(SqStack* s)
{
    s->top = -1;
    s->length = 0;
}

int push(SqStack* s, int elem)
{
    if(s->top == MAX_SIZE - 1)/*栈满*/
    {
        return 0;
    }

    s->length++;
    s->top++;   /*栈顶指针增加1*/
    s->elems[s->top] = elem;   /*将新插入元素赋值给栈顶空间*/
    return 1;
}

int pop(SqStack* s)
{
    if(s->top == 0) return 0;

    int elem = s->elems[s->top];  /*将要删除的栈顶元素赋值给e*/
    s->top--;   /*栈顶指针减1*/
    s->length--;
    return elem;
}
int main()
{
    int a[50];
    int operation[50];
    int i = 0;
    int m, n, flag = 0;
    printf("输入火车数量:");
    scanf("%d",&n); //火车数量n
    printf("输入车站最大停留数量:");
    scanf("%d",&m); //最大停留火车数量m(栈的上限)
    printf("输入出站序列:\n");
    for (i = 0; i < n; i++)
    {
        scanf("%d",&a[i]);  //输入{1,2,...,n}
    }

    int step = 0, b = 1;

    //栈的创建并赋值
    SqStack s;
    init(&s);
    push(&s,0);

    //模拟火车进栈调度
    for (i = 0; i < n; i++)
    {
        while(s.elems[s.top] < a[i])
        {
            push(&s,b++);
            operation[step++] = 1;
        }

        //超出栈的上限(栈底放入0,上限+1)
        if (s.length > m + 1)
        {
            printf("no\n");
            flag = 1; //标识无解决方案可满足条件
            break;
        }
		//直到找到与输入的出栈顺序相等的值
        if (s.elems[s.top] == a[i])
        {
            pop(&s);
            operation[step++] = 0;
        }
    }

    if (flag != 1)
    {
        if (s.length == 1 && s.top == 0)
        {
            for (i = 0; i < step; i++)
            {
                if (operation[i] == 1)
                    printf("push\n");
                else
                    printf("pop\n");
            }
        }
        else
            printf("no\n");
    }
    return 0;
}

总结

我们代码实现肯定不是最好,如果不足之处,请大家指正和补充。

最后

感觉有用的同学,请记得给大黍❤️关注+点赞+收藏+评论+转发❤️

作者:老九学堂—技术大黍

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。