《数据结构》课程设计参考样例
源程序下载
题目:全国交通咨询
一.设计目的
通过实习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、
编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及
操作方法,为进一步的应用开发打好基础。
二.问题描述
假设在铁路调度站(如教科书图 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)