数据结构.车厢调度
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ቤተ መጻሕፍቲ ባይዱ谢
!
收看 !
无 3进
3出 无 无 1出 无 2进 3进 3出 无 1出 2出 3进 1进 1出 空 无 3进 3出 2进 无 2出 3出 3进 2出 空 空 无 3出 无 输出3,2,1
2出 空
无
车 厢 调 度 的 状 态 图
输出3,2,1 空 无 输出3,2,1
无
空
无 输出3,2,1 空 无 输出3,2,1 空
数据结构课程设计
车厢调度
问题 描述:
假设停在铁路调度口的车厢序列的编号依次1,2,3,…,n, 设计一个程序,求出所有可能由此输出的长度为n的车 厢序列。
为使车厢能够调度,常把站台设计成栈式结构。 利用先进后出的性质,改变车厢的顺序。 从而,问题可以转化为: 1,2,3,…,n依次全部 进栈且全部出栈,求所有的出栈序列。
?
S(1,path,2) 停止 停止 输出 path[i]:2,1
S(1,path,1) push(2) S(2,path,1) pop()
停止
S(2,path,1) 停止
停止
输出 path[i]:1,2
进出栈情况:
初始状态: 1 2 1
①:
②:
1
③:
④:
2 1 ⑤: 1 ⑥: 1 ⑦:
⑧:
2
⑨:
…
问题 分析:
从具体问题入手: 第一步:假如有1,2,3准备进栈,此时具体的过程如下
第二步:对上述过程的进一步分析,一个数进栈以后,有 两种处理方式:要么下一个元素进栈(如果有的话),要 么立刻出栈;一个数出栈以后,要么继续出栈(如果栈不 为空),要么下一个元素进栈(如果有的话)
第三步:继续分析,由此得出一个结论,在操作过程中的 任何状态下都有两种可能的操作:“入”和“出”。每个 状态下处理问题的方法都是相同的,这说明问题本身具有 天然的递归特性,可以考虑用递归算法实现。
具体的调度函数的程序代码:
void SeqStack::Scheduling(int pos,int path[],int i){ int temp; if (pos<maxSize){ Push(pos+1); Scheduling(pos+1,path,i); Pop(); } if (IsEmpty()==false){ temp=Pop(); path[i++]=temp; Scheduling(pos,path,i); Push(temp); } if (pos==maxSize&&IsEmpty()==true){ count++; for (int j=0;j<i;j++) cout<<path[j]<<' '; cout<<'\t'; } }
主函数调用Scheduling函数后后究竟怎么执行的呢 现考虑只有两个车厢1,2
S(2,path,0) 停止 S(1,path,0) push(2) S(2,path,0) pop() t=path[0]=p op() S(1,path,1) push(t) t=path[0]=p op() S(1,path,1) push(t) S(1,path,1) 停止 t=path[0]=p op() S(1,path,2) push(t)
1出
本程序的主要算法分析: 调度函数的伪码算法如下: void Scheduling(int pos, int path[],int i) { if(pos<n) { 一个数进栈后,有两种处理方式:要么下一个数的进栈, 要么立刻出栈} if(!IsEmpty()==true){ 一个数出栈后,有两种处理方式:要么继续出栈,要么下一 个数的进栈} if(pos==n&&IsEmpty()){ 一种可能输出序列产生,输出} }