实验三栈与队列的应用Word文档下载推荐.docx
《实验三栈与队列的应用Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验三栈与队列的应用Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
2)输入迷宫内容
四、概要设计
为了实现上述程序功能,需要定义
1、Stack类
classStack
{
private:
LinkNode*top;
//指向第一个结点的栈顶指针
public:
Stack();
//构造函数,置空栈
~Stack();
//析构函数
voidPush(Te);
//把元素data压入栈中
TPop();
//使栈顶元素出栈
TGetPop();
//取出栈顶元素
voidClear();
//把栈清空
boolempty();
//判断栈是否为空,如果为空则返回1,否则返回0
};
2、描述迷宫中当前位置的T类
classT//定义描述迷宫中当前位置的结构类型
intx;
//x代表当前位置的行坐标
inty;
//y代表当前位置的列坐标
intdir;
//0:
无效,1:
东,2:
南,3:
西,4:
北
3、链表结点的LinkNode类
classLinkNode//链表结点
friendclassStack;
Tdata;
LinkNode*next;
4、本程序包含三个模块
1)主程序:
协调各函数的调用,实现所要求的功能;
2)三个类的定义:
3)迷宫:
迷宫的创建,路径的寻找以及输出;
4)各模块之间的调用关系如下:
主程序模块
迷宫模块
五、详细设计
1、描述迷宫中当前位置的T类的定义
2、描述链表结点的LinkNode类的定义
3、描述栈的类的定义
Stack:
:
Stack()//构造函数,置空栈
top=NULL;
}
~Stack()//析构函数
voidStack:
Push(Te)//把元素x压入栈中
LinkNode*P;
P=newLinkNode;
P->
data=e;
next=top;
top=P;
TStack:
Pop()//使栈顶元素出栈
TTemp;
P=top;
top=top->
next;
Temp=P->
data;
deleteP;
returnTemp;
GetPop()//取出栈顶元素
returntop->
Clear()//把栈清空
boolStack:
empty()//判断栈是否为空,如果为空则返回1,否则返回0
if(top==NULL)return1;
elsereturn0;
4、迷宫的获取
int**GetMaze(int&
m,int&
n)//返回存取迷宫的二维指针
int**maze;
//定义二维指针存取迷宫
inti=0,j=0;
cout<
<
"
请输入迷宫的长和宽:
;
inta,b;
cin>
>
a>
b;
//输入迷宫的长和宽
请输入迷宫内容:
\n"
m=a;
n=b;
//m,n分别代表迷宫的行数和列数
maze=newint*[m+2];
//申请长度等于行数加2的二级指针
for(i=0;
i<
m+2;
i++)//申请每个二维指针的空间
maze[i]=newint[n+2];
for(i=1;
=m;
i++)//输入迷宫的内容,0代表可通,1代表不通
for(j=1;
j<
=n;
j++)
maze[i][j];
for(i=0;
i++)//为迷宫的外圈设置障碍
maze[i][0]=maze[i][n+1]=1;
n+2;
i++)
maze[0][i]=maze[m+1][i]=1;
returnmaze;
//返回存贮迷宫的二维指针maze
5、迷宫路径的寻找
boolMazepath(int**maze,intm,intn)//寻找迷宫maze中从(0,0)到(m,n)的路径
//到则返回true,否则返回false
Stackq,p;
//定义栈p、q,分别存探索迷宫的过程和存储路径
TTemp1,Temp2;
intx,y,loop;
Temp1.x=1;
Temp1.y=1;
q.Push(Temp1);
//将入口位置入栈
p.Push(Temp1);
maze[1][1]=-1;
//标志入口位置已到达过
while(!
q.empty())//栈q非空,则反复探索
Temp2=q.GetPop();
//获取栈顶元素
if(!
(p.GetPop().x==q.GetPop().x&
&
p.GetPop().y==q.GetPop().y))
p.Push(Temp2);
//如果有新位置入栈,则把上一个探索的位置存入栈p
for(loop=0;
loop<
4;
loop++)//探索当前位置的4个相邻位置
x=Temp2.x+move[loop][0];
//计算出新位置x位置值
y=Temp2.y+move[loop][1];
//计算出新位置y位置值
if(maze[x][y]==0)//判断新位置是否可达
Temp1.x=x;
Temp1.y=y;
maze[x][y]=-1;
//标志新位置已到达过
//新位置入栈
if((x==(m))&
(y==(n)))//成功到达出口
Temp1.x=m;
Temp1.y=n;
Temp1.dir=0;
//把最后一个位置入栈
PrintPath(p);
//输出路径
Restore(maze,m,n);
//恢复路径
return1;
//表示成功找到路径
if(p.GetPop().x==q.GetPop().x&
p.GetPop().y==q.GetPop().y)
//如果没有新位置入栈,则返回到上一个位置
p.Pop();
q.Pop();
return0;
//表示查找失败,即迷宫无路经
6、迷宫路径的输出
voidPrintPath(Stackp)//输出路径
迷宫的路径为\n"
括号内的内容分别表示为(行坐标,列坐标,数字化方向,方向)\n"
Stackt;
//定义一个栈,按从入口到出口存取路径
LinkNode*temp;
temp=newLinkNode;
//申请空间
temp->
data=p.Pop();
//取栈p的顶点元素,即第一个位置
t.Push(temp->
data);
//第一个位置入栈t
deletetemp;
//释放空间
p.empty())//栈p非空,则反复转移
//获取下一个位置
//得到行走方向
a=t.GetPop().x-temp->
data.x;
//行坐标方向
b=t.GetPop().y-temp->
data.y;
//列坐标方向
if(a==1)temp->
data.dir=1;
//方向向下,用1表示
elseif(b==1)temp->
data.dir=2;
//方向向右,用2表示
elseif(a==-1)temp->
data.dir=3;
//方向向上,用3表示
elseif(b==-1)temp->
data.dir=4;
//方向向左,用4表示
//把新位置入栈
//输出路径,包括行坐标,列坐标,下一个位置方向
t.empty())//栈非空,继续输出
data=t.Pop();
'
('
data.x<
'
data.y<
data.dir<
"
//输出行坐标,列坐标
switch(data.dir)//输出相应的方向
case1:
↓)\n"
break;
case2:
→)\n"
case3:
↑)\n"
case4:
←)\n"
case0:
)\n"
7、迷宫的恢复
voidRestore(int**maze,intm,intn)//恢复迷宫
inti,j;
i++)//遍历指针
for(j=0;
j++)
if(maze[i][j]==-1)//恢复探索过位置,即把-1恢复为0
maze[i][j]=0;
8、main函数
intmain()
intm=0,n=0;
//定义迷宫的长和宽
maze=GetMaze(m,n);
//调用GetMaze(int&
n)函数,得到迷宫
if(Mazepath(maze,m,n))//调用Mazepath(int**maze,intm,intn)函数获取路径
迷宫路径探索成功!
elsecout<
路径不存在!
9、函数的调用关系图反映了演示程序的层次结构:
main
GetMaze(m,n)boolMazepath(int**maze,intm,intn)
PrintPath(Stackp)voidRestore(int**maze,intm,intn)
六、调试分析
1、刚开始是混淆了c语言和c++语言的不同,从而忽略了&
的用法,致使编写时费了许多时间去纠正错误;
2、本程序的模块划分简单而合理,在操作方面比较容易
3、本实验程序设计中,将程序分为三个模块,使得设计时思路清晰,实现时调试顺利,各模块具有较好的可重用性,确实得到了一次良好的程序设计训练。
七、测试结果
输入43后
输入迷宫的内容为
001
010
000
100
数字化方向指:
方向向下,用1表示;
方向向右,用2表示;
方向向上,用3表示;
方向向左,用4表示
八、实验总结
通过对实验的认真处理以及认真对待,对栈的相关性质得到了充分的认识,对算
法与程序的转变有了一定的了解,为以后做了一定的基础。
组员间相互配合不是
很好,希望能再接再厉。
注:
模块分工
柴春霞(2010100245)main函数的建立以及类的定义
郝瑞峰(2010100226)迷宫的获取与路径查询
张贞锋(2010100208)路径输出与迷宫的恢复