C++数据结构关于栈迷宫示例分析
发表于:2025-02-24 作者:千家信息网编辑
千家信息网最后更新 2025年02月24日,这篇文章主要讲解了"C++数据结构关于栈迷宫示例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C++数据结构关于栈迷宫示例分析"吧!一、实验目的理
千家信息网最后更新 2025年02月24日C++数据结构关于栈迷宫示例分析
这篇文章主要讲解了"C++数据结构关于栈迷宫示例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C++数据结构关于栈迷宫示例分析"吧!
一、实验目的
理解栈的抽象数据类型定义及操作特点。掌握顺序栈的存储结构的描述。掌握顺序栈的基本操作的实现方法。理解栈的广泛应用。
二、预备知识
阅读课程教材P44~45页内容,掌握栈的逻辑定义及"后进先出"的特点,理解抽象数据类型栈的定义。阅读课程教材P45~47页内容,理解顺序栈的存储特点及存储表示,掌握顺序栈各种基本操作(InitStack、StackEmpty、GetTop、Push、Pop等)的实现方法。阅读课程教材P50~52页内容,理解"迷宫求解"问题的含义,体会求解过程中栈的应用。仔细分析主要实现算法,理解求解步骤和方法。
三、实验内容
按如下要求编写程序,进行调试,写出调试正确的源代码,给出测试结果。
1.完成顺序栈的存储表示,实现顺序栈的各种基本操作,包括InitStack、StackEmpty、GetTop、Push、Pop等操作。
2.利用顺序栈求解迷宫中从入口到出口的一条路径,并输出结果。
说明:
(1)使用二维数组maze描述迷宫,迷宫的规模及初态自定。
(2)路径的输出形式可用文字描述,也可用图形描述。
定义一些代码:
#include#include #define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef struct {//栈元素类型 int x;//坐标 int y;//坐标 int di;//方向}position;using namespace std;typedef struct {//栈 position *base; position *top; int stacksize;}Stack;/*************************迷宫**********************************/int Maze[10][10] = {//迷宫 Maze(妹子)原型如下图:1表示路不通0表示可以通过。// 0 1 2 3 4 5 6 7 8 9 {1,1,1,1,1,1,1,1,1,1},//0 {1,0,0,1,0,0,0,1,0,1},//1 {1,0,0,1,0,0,0,1,0,1},//2 {1,0,0,0,0,1,1,0,0,1},//3 {1,0,1,1,1,0,0,0,0,1},//4 {1,0,0,0,1,0,0,0,0,1},//5 {1,0,1,0,0,0,1,0,0,1},//6 {1,0,1,1,1,0,1,1,0,1},//7 {1,1,0,0,0,0,0,0,0,1},//8 {1,1,1,1,1,1,1,1,1,1} //9};
定义类
class boos {//创建了一个角色类private: Stack sq_stack;//栈 position temp;public: /******************************栈的基本方法*******************/ void InitStack() {//创建栈 bool StackEmpty()//判断是否空栈 bool GetTop(position &temp)//获得栈顶 bool Push(position &temp)//入 bool Pop(position &temp)//出栈 void free_Stack()//释放栈空间 /******************************走迷宫方法*******************/ bool findMaze(int star_x, int star_y, int endr_x, int end_y) //迷宫的入口和出口坐标};
类的成员函数的一些说明:
这是一些基础方法 用于对栈的操作。
void InitStack() {//创建空的栈 sq_stack.base = (position *)malloc(sizeof(Stack)*STACK_INIT_SIZE); if (!sq_stack.base) exit(-1); sq_stack.top = sq_stack.base;/*FHL*/ sq_stack.stacksize = STACK_INIT_SIZE; cout << "栈创建成功" << endl; } bool StackEmpty() {判断是否空栈 if (sq_stack.top == sq_stack.base)return 1; else return 0; } bool GetTop(position &temp) {//得到栈顶元素 if (StackEmpty())return false; temp= *(sq_stack.top-1); return true; } bool Push(position &temp){//入栈/*FHL*/ if (sq_stack.top - sq_stack.base >= sq_stack.stacksize) { sq_stack.base = (position*)realloc(sq_stack.base sizeof(position)*(sq_stack.stacksize + STACKINCREMENT)); if(!sq_stack.base) exit(-1);/*FHL*/ sq_stack.top = sq_stack.base + sq_stack.stacksize; sq_stack.stacksize += STACKINCREMENT; } *sq_stack.top = temp; sq_stack.top++; return true; } bool Pop(position &temp) {//出栈 if (StackEmpty()) return 0; sq_stack.top--; temp = *sq_stack.top; return 1; } void free_Stack() { free(sq_stack.base); }
找迷宫的方法(dfs算法)
bool findMaze(int star_x, int star_y, int endr_x, int end_y) {//迷宫的入口和出口坐标 int i, j, k = 0;//i j表示目前的坐标 int tep_di,next_x,tep_y;//下一步的坐标 bool flag; position fan_maze[200]; InitStack();//先创建空栈 temp.x = star_x, temp.y = star_y, temp.di - 1;//开始位置 Push(temp);//入栈操作。/*FHL*/ Maze[star_x][star_y]=-1;//-1表示走过; while (!StackEmpty()) {//栈不为空 GetTop(temp);/*FHL*/ i = temp.x, j = temp.y , tep_di=temp.di; if (i == endr_x && j == end_y) { cout << "找到走出迷宫的路" << endl; k = 0; while (!StackEmpty()) { Pop(temp); fan_maze[k] = temp; k++;//k指向下一个被插入的位置; } cout <<"起点:"<< "(" << fan_maze[k-1].x << ',' << fan_maze[k-1].y << ")->" << endl; int count = 1; for(k-=2;k>0;k--) { cout<<"(" << fan_maze[k].x <<','<< fan_maze[k].y<<")->"; if (count % 3 == 0) cout << endl; count++; } cout << "(" << fan_maze[0].x << ',' << fan_maze[0].y << ")" << "终点" << endl;//出口的位置 free_Stack();//释放申请的堆空间 return true; }/*FHL*/ flag = 0; while (tep_di < 4 && !flag) { tep_di++; if (tep_di == 0){ next_x = i; tep_y = j + 1;} else if (tep_di == 1) { next_x = i + 1;tep_y = j; } else if (tep_di == 2) { next_x = i;tep_y = j - 1; } else { next_x = i - 1; tep_y = j; } if( Maze[next_x][tep_y] == 0 ) flag = 1; } if(flag) { (sq_stack.top-1)->di = tep_di;//记录上次坐标走的方向。 temp.x = next_x, temp.y = tep_y,temp.di=-1; Push(temp);//这次坐标入栈 Maze[next_x][tep_y] = -1;//当前坐标标记为走过。 } else { Pop(temp); Maze[temp.x][temp.y] = 0; } }/*FHL*/ cout << "没有找到对应的出口" << endl; free_Stack();//释放申请的堆空间 return false; }};
主函数(创建对象)
int main() { boos L1; L1.findMaze(1,1,8,8); system("pause");/*FHL*/ return 0;}
运行的一些截图:
1.当入口和终点一样时:
int main() { boos L1; L1.findMaze(1,1,1,1); system("pause"); return 0;}
2.终点是可以到达的路径
2.1(8,8)是终点
int main() { boos L1; L1.findMaze(1,1,8,8); system("pause"); return 0;}
2.2(8,2)是终点
int main() { boos L1; L1.findMaze(1,1,8,2); system("pause"); return 0;}
3.出口不通的情况
int main() { boos L1; L1.findMaze(1,1,9,9); system("pause"); return 0;}
感谢各位的阅读,以上就是"C++数据结构关于栈迷宫示例分析"的内容了,经过本文的学习后,相信大家对C++数据结构关于栈迷宫示例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
迷宫
坐标
方法
顺序
数据
内容
出口
结构
分析
终点
数据结构
示例
C++
入口
存储
位置
基本操作
教材
特点
空间
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
广西玉林网络安全
数字后端软件开发
软件开发的程序员工资
布莱克法律词典收录于哪个数据库
汕头数字软件开发价格走势
计算机网络技术的大专排名
画报网络安全
浙江常规网络技术咨询推荐
服务器指定的证书一直丢失
成都博软软件开发公司
网络安全教育快闪视频
用友附加数据库提示错误9003
查询数据库中所有空表
化工实时数据库采集
网络安全服务器配置心得体会
网络安全周志愿服务
软件开发项目复杂
四川网络安全集团基地
大兴区运营网络技术咨询哪家好
网络安全产业的展望
怎么查装的什么数据库
布莱克法律词典收录于哪个数据库
鲸钱包 服务器开小差
打印服务器软件
广州商城软件开发多少钱
登录用数据库失败怎么办
软件开发中不同阶段的技术
永恒之塔1717数据库
mac wps云服务器连接异常
爱思服务器下载