山东理工大学计算机学院课程设计(数据结构)班级计科1002姓名宫欣海学号1011051029指导教师刘晓红二○一一年一月十日课程设计任务书及成绩评定课题名称车厢调度Ⅰ、题目的目的和要求:巩固和加深对数据结构的理解,通过上机实验、调试程序,加深对课本知识的理解,最终使学生能够熟练应用数据结构的知识写程序。
(1)通过本课程的学习,能熟练掌握几种基本数据结构的基本操作。
(2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。
Ⅱ、设计进度及完成情况Ⅲ、主要参考文献及资料[1] 严蔚敏数据结构(C语言版)清华大学出版社 1999[2] 严蔚敏数据结构题集(C语言版)清华大学出版社 1999[3] 谭浩强 C语言程序设计清华大学出版社[4] 与所用编程环境相配套的C语言或C++相关的资料Ⅳ、成绩评定:设计成绩:(教师填写)指导老师:刘晓红(签字)二○一一年一月十日目录第一章概述 (1)第二章系统分析 (2)第三章概要设计………………………………………………………第四章详细设计………………………………………………………第五章运行与测试……………………………………………………第六章总结与心得……………………………………………………参考文献………………………………………………………………第一章概述课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。
课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。
《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。
数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
在这次的课程设计中我选择的题目是车厢调度。
首先在教科书3.1.2节中提供的栈的顺序存储结构SqStack之上实现栈的基本操作,即实现栈的类型。
程序对栈的任何存取(即更改,读取和状态判别等操作)必须借助于基本操作进行。
一般的说,在操作过程的任何状态下都有两种可能的操作:“入”和“出”。
每个状态下处理问题的发发是相同的,这说明问题本身具有天然的递归性,可以参考用递归的算法实现。
输入序列可以仅由一对整型变量表示,即给出序列头/尾编号。
输出序列用栈实现是方便的,只要再定义一个栈打印操作print(s),自低至顶顺序地印出栈元素的值。
本部分主要说明:课程设计的目的意义;对自己题目的问题描述;以上为样例,特别是字体,字号,行间距等均参照样例,以下同。
第二章系统分析1.问题分析:可假设对二叉树的n个结点从1到n编号,且令其先序序列为1,2,……,n,则不同的二叉树所得到的中序序列不同。
这样,不同形态的二叉树的数目正好是先序序列均为1,2,……,n的二叉树所能得到的中序序列的数目,而中序遍历的过程实际上是一个结点进栈和出栈的过程。
因此,序列1,2,……,n按不同顺序进栈和出栈所能得到的排列的数目正好是由先序序列为1,2,……,n所能得到的中序序列的数目,也就是先序序列为1,2,……,n的不同形态的二叉树的数目,其数目为:1 (2n)!Cn== ------ * --------n+1 n!*n!2.设计内容:现有n节车厢,按不同的顺序进栈和出栈,计算出所有的出栈序列并输出。
例如:有4节车厢则输出:4 3 2 12 3 4 11 3 4 23 4 2 12 3 1 41 32 43 2 1 42 1 4 31 2 4 33 2 1 42 13 41 2 3 42 43 11 4 3 2本部主要说明题目的基本要求,注意对题目的基本要求进行详细分析,尽量细化到程序中每个函数实现的功能都能在此处说明。
第三章 概要设计1.设定栈的抽象数据类型定义: ADT Stack {数据对象:D={i i a a |∈CharSet,i=1,2,...,n,,n ≥0}数据关系:R1={<i i i i a a a a ,|,11-->∈D,i=2,...,n} 基本操作: InitStack(&S)操作结果:构造一个空栈S 。
DestroyStack(&S)初始条件:栈S 已存在。
操作结果:销毁栈S 。
ClearStack(&S)初始条件:栈S 已存在。
操作结果:将栈S 清为空栈。
Sta初始条件:栈S 已存在。
操作结果:返回栈S 的长度。
StackEmpty(S)初始条件:栈S 已存在。
操作结果:若S 为空栈,则返回TURE ,否则返回FALSE 。
GetTop(S,&e)初始条件:栈S 已存在。
操作结果:若S 不空,则e 返回栈顶元素。
Push (&S ,&e )初始条件:栈S 已存在。
操作结果:在s 的栈顶插入新的栈顶元素e 。
Pop(&S,&e)初始条件:栈S 已存在。
操作结果:删除S 的栈顶元素,并以e 返回其值。
StackTraverse (S ,visit ()) 初始条件:栈S 已存在。
操作结果:从栈底到栈顶依次对S 中的每个元素调用函数visit ()。
}ADT Stack2.本程序包含两个模块 1)主程序模块: Void main() {初始化; For 循环 }2)栈模块——实现栈的抽象数据类型各模块之间的调用关系如下:栈模块本章主要介绍1、数据结构的设计主要介绍在实验中采用(或设计)的数据结构以及原因。
2、算法的设计主要说明本设计从总体上划分几个模块,每个模块需要完成的功能是什么?定义每个模块对应的函数接口,用伪代码(类C或C++)设计每个模块对应的算法。
3、抽象数据类型的设计根据所设计的数据结构和接口函数,写出抽象数据类型定义或者简单类定义。
第四章详细设计1)栈类型;typedef struct stacklist{SElemType *base;SElemType *top;int stacksize;}SqStack;栈的基本操作设置如下:void Stack_init(SqStack *s)//初始化,设s为空栈void Stack_Push(SqStack *s,SElemType e)//若分配空间成功,则在s的栈顶插入新的元素e,并返回TRUE//若栈不变,并返回FALSESElemType Stack_Pop(SqStack *s)Status Stack_Empty(SqStack *s)Status Stack_Full(SqStack *s)void Stack_printreverse(SqStack s)void search(SqStack *inputPoint,SqStack *tempPoint,SqStack *outputPoint)2)代码#include <iostream>using namespace std;typedef int SElemType;typedef int Status;int end;/*最后一个车厢的号码*/long total=0;/*总的组合方案数目*/typedef struct stacklist{SElemType *base;SElemType *top;int stacksize;}SqStack;void Stack_init(SqStack *s){s->base=(SElemType *)malloc(end*sizeof(int)); if(!s->base) exit(0);s->top=s->base;s->stacksize=end;}void Stack_Push(SqStack *s,SElemType e){*(s->top)++=e;}SElemType Stack_Pop(SqStack *s){if(s->top==s->base)return 0;return *(--(s->top));}Status Stack_Empty(SqStack *s){if(s->top==s->base)return 1;return 0;}Status Stack_Full(SqStack *s){if(s->top-s->base==end)return 1;return 0;}void Stack_printreverse(SqStack s){int *po;po=s.base;printf("\t[%ld]: ",total);for(;po!=s.top;)printf("%d ",*po++);printf("\n");}void search(SqStack *inputPoint,SqStack *tempPoint,SqStack *outputPoint) {if(!Stack_Empty(inputPoint)){Stack_Push(tempPoint,Stack_Pop(inputPoint));search(inputPoint,tempPoint,outputPoint);Stack_Push(inputPoint,Stack_Pop(tempPoint));}if(!Stack_Empty(tempPoint)){Stack_Push(outputPoint,Stack_Pop(tempPoint));search(inputPoint,tempPoint,outputPoint);Stack_Push(tempPoint,Stack_Pop(outputPoint));}if(Stack_Full(outputPoint)){total++;Stack_printreverse(*outputPoint);}}主函数:void main(){SqStack input,temp,output;int i;printf("\n\n\t\t\t\t车厢调度\n");printf("\n\t请输入车厢长度: ");scanf("%d",&end);/*初始化三个栈*/Stack_init(&input);Stack_init(&temp);Stack_init(&output);/*将车厢号码进栈*/for(i=end;i>=1;i--)Stack_Push(&input,i);search(&input,&temp,&output);}1、设计抽象数据类型对应的类定义。