数据结构课程设计车厢调度

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计
题目名称:车厢调度
计算机科学与技术学院
1. 需求分析
假设停在铁路调度站入口处的车厢序列的编号一次为1,2,3,…,n。

设计一个程序,求出所有可能由此输出的长度为n的车厢序列。

实现栈的顺序存储结构SqStack之上实现栈的基本操作,即实现栈类型。

程序对栈的基本操作必须借助于基本操作进行。

规定:
(a) 输入的形式为整形,输入值的范围为100内整数;
(b) 输出的形式为整形,以2位的固定位宽输出;
(c) 程序所能达到的功能;输入车厢长度n,输出所有可能的车厢序列;
(d) 测试数据:测试数据取 n=3,4, 0,101,程序输出的结果应该在屏幕上显示出来。

2. 概要设计
具体要求:火车调度问题最适合用数据结构中的栈来解决。

而解决相应问题算法核心,是栈的递归。

所以程序除了要有栈的基本函数,还要有以递归算法为核心的函数。

设计思想:一个数的进栈以后,有两种处理方式:要么立刻出栈,或者下一个数的进栈(如果还有下一个元素)。

其出栈以后,也有两种处理方式:要么继续出栈(栈不为空),或者下一个数的入栈。

核心算法:包含两重递归,下一个元素处理完后返回,再处理出栈的递归。

进栈的递归跳出条件为最后一个元素进栈。

出栈的递归跳出条件为栈空各模块功能如下:
栈的定义:
struct snode //结构体
void Initstack() //初始化
void push(int q) //入栈
int pop() //出栈
int Emptys() //判断栈是否为空
核心算法:
void process(int pos,int path[],int curp)//当前处理位置pos的元素
3. 详细设计
栈的数据结构:
struct snode
{
int data[MaxLen];
int top;
} s;//定义一个栈指针
void Initstack()//初始化
{
s.top=-1;
}
void push(int q)//入栈
{
s.top++;
s.data[s.top]=q;
}
int pop()//出栈
{
int temp;
temp=s.data[s.top];
s.top--;
return temp;
}
int Emptys()//判断栈是否为空
{
if(s.top==-1)
return 1;
else
return 0;
}
核心算法:
void process(int pos,int path[],int curp)//当前处理位置pos的元素{
int m,i;
if(pos<n)//编号void process(int pos,int path[],int curp)//当前处理位置pos的元素进栈递归
{
push(pos+1);//当前元素进栈后下一个元素继续进栈
process(pos,path,curp);//出栈后处理下一个元素继续进栈
push(m);
}
if(pos==n&&Emptys())//输出一种可能的方案
{
for(i=0; i<curp; i++)
printf("%2d",path[i]);
printf("\n");
}
}
主程序描述:
int main()
{
int path[MaxLen];
printf("输入要调度车厢总数:");
scanf("%d",&n);
if(n<=0||n>100)
printf("输入错误\n");
else
{
Initstack();
push(1);
printf("所有输出序列:\n");
process(1,path,0); //从1 开始,递归处理所有元素
}
}
4. 调试分析
遇到问题:输入不在设定范围内的数字,而没有错误提示。

解决办法:在主程序中加入判断输入数字的函数,若所输入的数字不在范围内,则输出“输入错误”。

经验和体会:本程序以栈为基本,核心算法通过两次递归调用实现。

可以实现任务书里所要求的功能,但是也存在着不足之处,即无法循环输入。

所以存在一些值得深入优化解决的问题。

通过此次课程设计,我知道了如何利用数据结构的知识解决实际问题。

提高了我分析处理问题的能力,例如什么问题适合用什么
数据结构解决,怎样解决等等,做到了学以致用。

5. 用户使用说明
(1)双击“车厢调度.exe”文件;
(2)根据提示输入车厢数,按回车结束;
(3)程序输出所有可能的车厢序列。

6. 测试结果
测试数据分别为3,4,0,101,结果如下
7. 测试情况:
测试情况正常,输入设定范围内的数字时能正常输出结果,输入设定范围外的数字时能提示“输入错误”。

附录
源程序
#include<stdio.h>
#define MaxLen 100
struct snode
{
int data[MaxLen];
int top;
} s; //定义一个栈指针
int n;//定义输入序列总个数
void Initstack()
{
s.top=-1;
}
void push(int q)//入栈
{
s.top++;
s.data[s.top]=q;
}
int pop()//出栈
{
int temp;
temp=s.data[s.top];
s.top--;
return temp;
}
int Emptys()//判断栈是否为空
{
if(s.top==-1)
return 1;
else
return 0;
}
void process(int pos,int path[],int curp)//当前处理位置pos的元素{
int m,i;
if(pos<n)//编号进栈递归
{
push(pos+1);//当前元素进栈后下一个元素继续进栈
process(pos+1,path,curp); //处理下一个元素,返回表明下一个元素进栈的情况处理完了
pop(); //下一个元素处理完后,pop 掉,准备处理直接出栈}
if(!Emptys())//递归处理出栈
{
m=pop();
path[curp]=m;
curp++;
process(pos,path,curp);//出栈后处理下一个元素继续进栈
push(m);
}
if(pos==n&&Emptys())//输出一种可能的方案
{
for(i=0; i<curp; i++)
printf("%2d",path[i]);
printf("\n");
}
}
int main()
{
int path[MaxLen];
printf("输入要调度车厢总数:");
scanf("%d",&n);
if(n<=0||n>100)
printf("输入错误\n");
else
{
Initstack();
push(1);
printf("所有输出序列:\n");
process(1,path,0); //从1 开始,递归处理所有元素
}
}。

相关文档
最新文档