1 / 21
文档名称:

数据结构之火车厢重排.docx

格式:docx   大小:300KB   页数:21页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

数据结构之火车厢重排.docx

上传人:cjl201801 2022/5/15 文件大小:300 KB

下载得到文件列表

数据结构之火车厢重排.docx

文档介绍

文档介绍:目录
一、功能描述 2
1、输入火车厢信息 2
2、入轨 2
3、出轨 2
4、退出 2
二、 总体概要设计 2
1、系统设计框图 : 2
2、系统设计流程图 3
三、详细设计 3
功能一:输入火车厢信息堆栈*/
push(top,A[0],0);/* 把第一节车厢压入缓冲铁轨*/
printf(" 缓冲铁轨 : 1 栈顶值 :%d\n",top[0]->data);
for(m=1;m<M;m++)/* 把车厢都压入缓冲铁轨*/
{ if(A[m]>top[k]->data) /* 前面所有栈顶值最大值一定为最后一个
栈的栈顶值,如果此次需进栈的车厢号比前面所有栈顶值都大重新建立一个新的栈并
把车厢号压入新的栈的栈底*/
{
init(top,++k);
push(top,A[m],k);
printf(" 缓冲铁轨: %d 栈顶值: %d\n",k+1,top[k]->data); }
else
/* 将此次需进栈的车厢号与所有栈顶值比较,插入到第一次遇到的栈顶值比将要入栈
的车厢号要大的栈中,比如
要插入 10 号车厢,缓冲铁轨的栈顶值排列如下: 2、 11、 5、 12, 13,将10插在 11 所
在的栈的栈顶*/
{l=0;
while(l<=k)
{
if(A[m]>top[l]->data)
l++;
else
{
push(top,A[m],l);
printf(" 缓冲铁轨 : %d 栈顶 值 :%d\n",l+1,top[l]->data);
l=k+1;
}
}
}
}
return k+1;
}
3) 算法分析:
本函数实现的是提示每节车厢应进入的缓冲铁轨号及将每节车厢压入到缓
冲铁轨中,首先将存放车厢号的数组及将要进行初始化的栈顶指针数组top[]
作为实参传递给本自定义函数,首先初始化第一个堆栈,把第一节车厢压入栈
中,输出缓冲铁轨号及第一节车厢号,后用 for 循环从第二个将要进栈的元素
与前面的元素比较,前面所有栈顶值最大值一定为最后一个栈的栈顶值,如果
此次需进栈的车厢号比前面所有栈顶值都大就重新初始化一个新的栈把车厢号
压入新的栈的栈底并输出当前栈的栈号及本栈的栈顶值,否则就把需进栈的车
厢号压入前面已经存在的缓冲铁轨中。从第一个栈开始循环,找出第一个栈顶
元素比需进栈元素要大的栈,将该车厢压入此栈中并修改栈顶值。就这样利用
循环控制所有的车厢都进入到缓冲铁轨中。
其中单个入栈函数push ()函数的实现过程如下:定义一个我们自定义的
结构体类型的指针,利用此指针申请一个新节点,将车厢号送入该节点的数据
域,并将原来的栈顶指针top 移向该新申请的节点,始终使得top 指针指向栈
顶元素。
该算法最好的情况下(相对最好,因为此情况下需使用大量的堆栈)只需
在当前最后一个堆栈进行操作,时间复杂度为 O(1) ,最差情况下(就是只有当
前最后一个堆栈的栈顶值大于需进栈的车厢号)的时间复杂度为: O(M*k) 。
3 功能三:出轨
1)概要设计:
利用 for 循环每次都找出最小的栈顶元素显示该最小元素所在的栈号并使
得其出栈完成火车厢重排工作。本自定义的函数实现过程中调用了判断堆栈为
空函数及单个元素出栈函数,实现大量判断堆栈元素是否已经出栈为空并找到
合适的栈顶元素后就将该车厢出栈的操作。
)算法描述:
流程图:
代码:
int empty( STLink top口,int n) /* 判断是否为空 */ {
return (top[n]==NULL);
int pop(STLink top[],int m) /* 出栈 */ {
int A;
STLink p;
p=top[m];
A=p->data;
top[m]=top[m]->link;
free(p);
return A;
}
void trainpop(int M,int A[],STLink top[],int N)
{
int m,n=0,min,l=0,amin=0;/* 把所有车厢都压出缓冲铁轨*/
/*min=top[n]->data;
for(m=0;m<M;m++)
{
for(l=n+1;l<N;l++) /* 从第一个非空栈的第二栈起,将栈顶值与最小值
比较 */
/*{
if((top[l]!=NULL