logo资料库

《车厢调度》课程设计.doc

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
《数据结构》课程设计参考样例
源程序下载
一.设计目的
二.问题描述
假设在铁路调度站(如教科书图3.1(b)所示)入口处的车厢序列的编号依次为1,2,3,...,n。设
三.需求分析
四.概要设计
五.详细设计
《数据结构》课程设计参考样例 源程序下载 题目:全国交通咨询 一.设计目的 通过实习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、 编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及 操作方法,为进一步的应用开发打好基础。 二.问题描述 假设在铁路调度站(如教科书图 3.1(b)所示)入口处的车厢序列的编号依次为 1,2,3,...,n。 设计一个程序,求出所有可能由此输出的长度为 n 的车厢序列。 [ 基本要求] 首先在教科书上提供的栈的顺序存储结构 Seqstack 之上实现栈的基本操作,即实现栈类 型。程序对栈的任何存取(即更改,读取和状态判别等操作)必须借助于基本操作进行。 [ 实现提示] 一般的说,在操作过程的任何状态下都有两种可能的操作:"入"和"出"。每个状态下处理 问题的方法都是相同的,这说明问题本身具有天然的递归特性,可以考虑用递归算法实现, 输入序列可以仅由一对整形变量表示,即给出序列头/尾编号。输出序列用栈实现是方便的 (思考:为什么不应该用队列实现)只要再定义一个栈,打印操作 print(s),自底至顶顺序的印 出栈元素的值。 三.需求分析 该程序所做的工作的是模拟车厢调度站的工作,为车厢调度的可行性进行演算,或 输出所有车厢序列。此程序规定: (1) 在程序中输入待进站的车厢序列时,不需要输入所有的车厢编号,只需要输 入首列车厢的编号和尾列车厢的编号即可。需要分别输入两个整型数据。 (2) 程序的输出信息主要是:车厢出站的所有序列,或查找序列的可行性,对于 可行性的输出。可附带输出车厢的进出序列。(一连串的:出入出入…) (3) 程序的功能包括:对栈的数据结构的基本操作,如入栈,出栈等。以及对 车厢进站,出站的操作。 四.概要设计
 系统用到的抽象数据类型定义: 1.ADT Stack{ 数据元素:可以是任意类型的数据,但必须属于同一个数据对象。 数据关系:栈中数据元素之间是线形关系。 基本操作: (1) Initstack(&s); (2) IsEmpty(&s); (3) IsFull(&s); (4) Push(&s,x); (5) Pop(&s,&x); (6) ClearStack(&s); (7) GetTop(&s,x); }ADT Stack  系统中子程序及功能要求: 1.in(SeqStack *s1,SeqStack *s2,int first,int final,int num):对车厢进行 入站操作。并记录操作的次数。 2.show(SeqStack *s,int way):所有进站,出站完成后对输出序列进行输出。 3.out(SeqStack *s1,SeqStack *s2,int first,int final,int num):对车厢 进行出站操作。并记录操作次数。 4.Control(SeqStack *s1,SeqStack *s2,int first,int final,int num):对 in 和 out 函数进行调用。在 in 和 out 函数里间接 第归。  各程序模块之间的调用关系(子程序编号见上): 主函数可调用子程序 1,3,4; 子程序 3 可调用子程序 4,2; 子程序 1 可调用子程序 4; 子程序 4 可调用子程序 1,3; 五.详细设计 进站的伪代码如下: void in(SeqStack *s1,SeqStack *s2,int first,int final,int num) { if(首列车厢号!=尾列车厢号+1) { 输出进出序列的字符串加入一个 “入”; 进站 总操作次数减一: if(首列车厢号<尾列车厢号+1) 首列车厢号++; Control(s1,s2,first,final,num); } } 出站的伪代码如下: int out(SeqStack *s1,SeqStack *s2,int first,int final,int num) { if(剩下的操作次数<=0) { 输出车厢序列; return true; }
if(栈是空的) return true; int exchange; 进出序列字符串加上“ 出”; 出栈一; 进栈二; 总操作次数--; Control(s1,s2,first,final,num); return true; } 控制的伪代码如下: int Control(SeqStack *s1,SeqStack *s2,int first,int final,int num) { 复制一份栈一的数据; 复制一份栈二的数据; 复制一份进出序列字符串数据; in(s1,s2,first,final,num); 搬回两个栈的复制数据 搬回字符串的数据; out(s1,s2,first,final,num); return true; } 显示输出函数的伪代码如下: void show(SeqStack *s,int way) { if(way==0) { 输出是第几个序列; for(int i=0;i<=s->top;i++) { 输出栈中的数据; } cout<top;i++) { if(栈中的数据!=要查找的数据) { sign=0; break; } } if(sign==1) { cout<<"已成功查找到序列:"; number++;
for(int i=0;i<=s->top;i++) { 输出栈的数据; } cout<
in(s1,s2,first,final,num); *s1=Copy1; *s2=Copy2; myString=CopyString; out(s1,s2,first,final,num); return true; } 显示输出的完整代码如下: void show(SeqStack *s,int way) { if(way==0) { cout<<"("<top;i++) { cout<elem[i]<<" "; } cout<top;i++) { if(s->elem[i]!=s3.elem[i]) { sign=0; break; } } if(sign==1) { cout<<"已成功查找到序列:"; number++; for(int i=0;i<=s->top;i++) { cout<elem[i]<<" "; } cout<
当选择显示所有序列时,输出如下: 与实际情况相符;输出正确! 当选择查找序列时,输出如下: 与实际相符,输出正确! 再输入 1 2 3 4 5 的序列: 选择 0 选项:
选择查找序列时; 与实际相符,程序正确! 七 使用说明: 操作简单无特别说明! 九.完整原代码如下:
#define Stack_Size 50 #define StackElementType int typedef struct { StackElementType elem[Stack_Size]; int top; }SeqStack; #include #include using namespace std; int number; int outWay=0; string myString; #include "类的定义.h" SeqStack s3; void in(SeqStack *s1,SeqStack *s2,int first,int final,int num); void show(SeqStack *s); int out(SeqStack *s1,SeqStack *s2,int first,int final,int num); int Control(SeqStack *s1,SeqStack *s2,int first,int final,int num); void Initstack(SeqStack *s) { s->top=-1; } int IsEmpty(SeqStack *s) { return (s->top==-1?true:false); } int IsFull(SeqStack *s) { return s->top==Stack_Size-1?true:false; } int Push(SeqStack *s,StackElementType x) { if(s->top==Stack_Size-1) return false; s->top++; s->elem[s->top]=x; return true; } int Pop(SeqStack *s,StackElementType *x) { if(s->top==-1) return false; else { *x=s->elem[s->top]; s->top--; return true; } } void in(SeqStack *s1,SeqStack *s2,int first,int final,int num)
分享到:
收藏