千家信息网

怎么用C语言递归实现火车调度算法

发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,这篇文章主要介绍怎么用C语言递归实现火车调度算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、代码题目如下:2.8编号为1,2,3,4的四列火车通过一个栈式的列车调度站,可
千家信息网最后更新 2025年02月08日怎么用C语言递归实现火车调度算法

这篇文章主要介绍怎么用C语言递归实现火车调度算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

1、代码

题目如下:
2.8编号为1,2,3,4的四列火车通过一个栈式的列车调度站,可能得到的调度结果有哪些?如果有n列火车通过调度站,请设计一个算法,输出所有可能的调度结果。

算法运用的思想是运用栈+递归,算法的难点也在于此。先上代码:

#include #define MAX 100typedef struct s{        char a[MAX];        int top;}Stack;/*定义栈的数据*//*定义一些全局变量*/Stack S;/*定义全局性的栈*/char d[MAX],seq[MAX];/*d[MAX]用于存储原始入栈序列,seq[MAX]用于存储输出序列*/int len;/*定义将通过栈的元素个数*/ int count=0;/* 用于统计输出序列的个数  */void initStack(Stack *S) /*初始化空栈*/{        S->top=-1;}void push(Stack *S,char x) /*进栈*/{        if(S->top>=MAX) return;        S->top++;        S->a[S->top]=x;}char pop(Stack *S) /*出栈*/{        if (S->top==-1)         { printf("ERROR, POP Empty Stack");          return -1;     }          S->top--;            return S->a[S->top+1];  } int isEmpty(Stack *S)/*判断栈是否为空*/  {             if (S->top==-1) return 1;         return 0; } void outSeq(char *seq, int len)/*输出顶点序列*/  {            int i;         for(i=0; i=len && isEmpty(&S))          { outSeq(seq,len); count++; } }int main(){    int i;    printf("\nplease input the num be scheduled: ");    scanf("%d", &len); /*用len存储待调度的火车数量*/    for(i=0; i

输入3(即三列火车),得到的结果如下:

2、代码详解

本算法主要是运用了栈+递归+回溯的思想,主要的代码块有三个:
代码块1

if(pos

代码块2

if (!isEmpty(&S)){        t=pop(&S);         seq[seq_pos++]=t;         scheduler(pos,seq_pos);         push(&S,t);         }

代码块3

if (pos>=len && isEmpty(&S))          { outSeq(seq,len); count++; }

这里需要注意的是判定元素pos,是处理原始数据中第pos个元素,pos从0开始
代码块1根据你输入的len和第pos个元素来判定是否执行代码块1
例如当你输入了3,
通过代码

scanf("%d", &len);   for(i=0; i

即有三列火车,分别代号为1,2,3
数组d中的位置分别是0,1,2

当代码第一次执行

void scheduler(int pos, int seq_pos)

函数的时候,进入了判定
此时参数pos和seq_pos都为0
那么0代码块1把数组第0个元素压入栈中,即1号火车进入车站

接着进行第一次调用函数scheduler

此时参数pos为1,seq_pos为0
因为1<3,继续执行代码块1
代码块1把数组第1个元素压入栈中,即2号火车进入车站

进行第二次调用函数scheduler

此时参数pos为2,seq_pos为0
因为2<3,继续执行代码块1
代码块1把数组第2个元素压入栈中,即3号火车进入车站

进行第三次调用函数scheduler

此时参数pos为3,seq_pos为0
因为3=len=3,所以开始执行代码块2

在代码块2中,把栈顶的元素赋值给t,同时把t放入seq数组的第0个位置中,seq++
即3号列车驶出火车站

进行第四次调用函数sceduler

此时参数pos=3,seq_pos=1
继续执行代码块2,把栈顶的元素赋值给t,同时把t放入seq数组的第1个位置中,seq++
即2号列车驶出火车站

进行第五次调用函数sceduler

此时参数pos=3,seq_pos=2
继续执行代码块2,把栈顶的元素赋值给t,同时把t放入seq数组的第2个位置中,seq++
即1号列车驶出火车站

进行第六次调用函数scheduler

此时参数pos=3,seq_pos=3,现在的情况是三列火车都已经驶出火车站了,也就是栈已经空了,同时满足pos>=len的条件,所以执行代码块3

代码块3把结果进行了输出,
输出结果是3,2,1
第六次调用函数scheduler整个过程结束

此时,代码开始进行回溯

回到了第五次调用函数scheduler
代码块2中scheduler执行完,执行push,也就是压栈操作,可是现在已经没有火车进站了,因为三列火车都已经走了

代码回到了第四次调用函数scheduler
代码块2中scheduler执行完,执行push,也就是压栈操作,也没有火车能进车站了
为什么?
还记不记得这个时候是3号列车和2号列车已经出去了,1号列车在车站里,所以没有多余的进站的车了

代码代码回到了第三次调用函数scheduler
还记不记得这个时候是3号列车、已经出去了,1号列车和2号列车在车站里,所以没有多余的进站的车了

代码代码回到了第二次调用函数scheduler

代码重新回到了代码块1

注意,是代码块1

此时,执行了pop,也就是进行了出栈操作
什么意思?
栈顶的3号列车驶出了车站

这里是笔者出现了思维误区的地方,读者不理解递归思想的需要特别注意,当时我在想,3号列车驶出后是不是回到了第一次调用函数?忽略了下面的if语句,错误的认为执行了代码块1后不会执行代码块2,混淆了if-else和if,if语句的关系

代码1执行完,开始执行代码2
注意此时的列车只有两辆,是1号列车和2号列车,参数是pos=2,seq_pos=0

代码块2进行了出栈操作,让在栈顶的2号列车出车站,然后seq_pos++

进行第七次调用函数sceduler

此时代码参数pos=2,seq_pos=1
pos=2代码块1
代码块1把pos=2的元素压入栈中
什么意思?
把三号列车驶入车站

进行第八次调用函数sceduler

此时代码参数pos=3,seq_pos=1
pos=3=len=3,进入代码块2
代码块2进行了出栈操作,让在栈顶的3号列车出车站
然后seq_pos++

进行第九次调用函数scheduler

此时代码参数pos=3,seq_pos=2
pos=3=len=3,进入代码块2
代码块2进行了出栈操作,让在栈顶的1号列车出车站
然后seq_pos++

进行第十次调用函数scheduler

pos=3=len=3,同时栈里的三辆列车已经全部驶出车站了,所以进行执行代码块3
代码块3把结果进行了输出
输出结果是2,3,1

以此类推…

3、用二叉树表示调用过程

左子树表示压栈(进站),右子树表示出栈(驶出车站),线上数字表示调用函数次数,负数表示出栈,例如-1表示1号列车驶出车站

4、思维导图


以上是"怎么用C语言递归实现火车调度算法"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

代码 列车 火车 函数 元素 参数 车站 数组 输出 调度 结果 算法 递归 同时 个位 也就是 序列 火车站 原始 个数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 江西备案服务器虚拟主机 中文识别服务器 数据库发生死锁deak 金税盘提示数据库链接失败 描写网络安全的句子有哪些 路南区开展网络安全宣传活动 深圳web前端软件开发哪里有 图片服务器安全 软件开发开发过程 ouo服务器 需要布线的网络技术 杨浦区辅助软件开发质量保障 龙源数据库可以用作者查文献吗 如何自动更改dns服务器 云服务器不能安装驱动吗 计算机三级网络技术题库破解 高并发下数据库为什么会挂 软件开发面试题目怎么准备 明日之后宾格尔服务器怎么没了 玖住互联网科技有限公司 周期查数据库发邮件 杭州企业软件开发怎么样 数据库与数据挖掘关系 软件开发工程师费视力 辽宁服装外贸软件开发 数据库连接线程池什么时候会回收 数据库的增删改查语句 毕马威身份证已在数据库中 笔记本游戏服务器断开 计算机三级网络技术题库破解
0