实验三栈与队列的应用Word文档下载推荐.docx

上传人:b****4 文档编号:18484843 上传时间:2022-12-17 格式:DOCX 页数:12 大小:59.84KB
下载 相关 举报
实验三栈与队列的应用Word文档下载推荐.docx_第1页
第1页 / 共12页
实验三栈与队列的应用Word文档下载推荐.docx_第2页
第2页 / 共12页
实验三栈与队列的应用Word文档下载推荐.docx_第3页
第3页 / 共12页
实验三栈与队列的应用Word文档下载推荐.docx_第4页
第4页 / 共12页
实验三栈与队列的应用Word文档下载推荐.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

实验三栈与队列的应用Word文档下载推荐.docx

《实验三栈与队列的应用Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验三栈与队列的应用Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。

实验三栈与队列的应用Word文档下载推荐.docx

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)路径输出与迷宫的恢复

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 调查报告

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1