C++数据结构关于栈迷宫求解示例

目录
  • 一、实验目的
  • 二、预备知识
  • 三、实验内容
  • 定义一些代码:
    • 定义类
  • 类的成员函数的一些说明:
  • 找迷宫的方法(dfs算法)
  • 主函数(创建对象)
  • 运行的一些截图:
    • 1.当入口和终点一样时:
    • 2.终点是可以到达的路径
    • 3.出口不通的情况

一、实验目的

理解栈的抽象数据类型定义及操作特点。掌握顺序栈的存储结构的描述。掌握顺序栈的基本操作的实现方法。理解栈的广泛应用。

二、预备知识

阅读课程教材P44~45页内容,掌握栈的逻辑定义及“后进先出”的特点,理解抽象数据类型栈的定义。阅读课程教材P45~47页内容,理解顺序栈的存储特点及存储表示,掌握顺序栈各种基本操作(InitStack、StackEmpty、GetTop、Push、Pop等)的实现方法。阅读课程教材P50~52页内容,理解“迷宫求解”问题的含义,体会求解过程中栈的应用。仔细分析主要实现算法,理解求解步骤和方法。

三、实验内容

按如下要求编写程序,进行调试,写出调试正确的源代码,给出测试结果。
1.完成顺序栈的存储表示,实现顺序栈的各种基本操作,包括InitStack、StackEmpty、GetTop、Push、Pop等操作。
2.利用顺序栈求解迷宫中从入口到出口的一条路径,并输出结果。
说明:
(1)使用二维数组maze描述迷宫,迷宫的规模及初态自定。
(2)路径的输出形式可用文字描述,也可用图形描述。

定义一些代码:

#include<iostream>
#include<cstdlib>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef 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++数据结构栈迷宫的资料请关注我们其它相关文章!

(0)

相关推荐

  • C语言解线性方程的四种方法

    发了好几天编了个解线性方程组的小程序,可第一次实战就大败而归.经过半天的调试,仍找不出纠正的方法.因为并不是算法的问题,而是因为自己对编译器处理 浮点函数的方法不是很理解.明明D=0的方阵解出来不等于0了,跟踪调试发现,计算过程程序对数据进行了舍去处理,导致最终结果不对.不过如果没有浮点型 的话,这个程序应该算不错了 . 复制代码 代码如下: #include<stdio.h>#include<math.h>#include<mem.h>#define NUM 100v

  • C语言程序设计50例(经典收藏)

    [程序1]题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 2.程序源代码: 复制代码 代码如下: #include "stdio.h"#include "conio.h"main(){  int i,j,k;  printf("\n");  for(i=1;i<5;i++) /*以下为三重循环*/   

  • C语言求两个字符串的最长公共子串

    本文实例讲述了C语言求两个字符串的最长公共子串的方法.分享给大家供大家参考.具体实现方法如下: #include "stdio.h" #include "string.h" #include "stdlib.h" void getCommon(char str1[],char str2[],char * str3); int stringLength(char * str); void main(){ char str1[50]; char st

  • C语言经典例程100例(经典c程序100例)

    我们小编注:以下代码因为编辑器等原因,需要将原来空白区域用tab或空格替换即可运营. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去掉不满足条件的排列. 2.程序源代码 main() { int i,j,k; printf("\n"); for(i=1;i<5;i++) /*以下为三重循环*/ for(j=1;j<5;j++) for (k=1

  • C语言程序设计第五版谭浩强课后答案(第二章答案)

    1. 什么是算法?试从日常生活中找3个例子,描述它们的算法 算法:简而言之就是求解问题的步骤,对特定问题求解步骤的一种描述. 比如生活中的例子: 考大学 首先填报志愿表.交报名费.拿到准考证.按时参加考试.收到录取通知书.按照日期到指定学校报到. 去北京听演唱会 首先在网上购票.然后按时坐车到北京,坐车到演唱会会场. 把大象放进冰箱 先打开冰箱门,然后将大象放进冰箱,关冰箱. 2. 什么叫结构化的算法?为什么要提倡结构化的算法? 结构化算法:由一些顺序.选择.循环等基本结构按照顺序组成,流程的转

  • C++数据结构关于栈迷宫求解示例

    目录 一.实验目的 二.预备知识 三.实验内容 定义一些代码: 定义类 类的成员函数的一些说明: 找迷宫的方法(dfs算法) 主函数(创建对象) 运行的一些截图: 1.当入口和终点一样时: 2.终点是可以到达的路径 3.出口不通的情况 一.实验目的 理解栈的抽象数据类型定义及操作特点.掌握顺序栈的存储结构的描述.掌握顺序栈的基本操作的实现方法.理解栈的广泛应用. 二.预备知识 阅读课程教材P44~45页内容,掌握栈的逻辑定义及"后进先出"的特点,理解抽象数据类型栈的定义.阅读课程教材P

  • C语言数据结构之迷宫求解问题

    现在网上各种对于迷宫的求解,版本多的数不胜数.本人小白一枚,贴上自己对迷宫的求解这个小项目,自己写的.望能帮助一些同样有困难的人,毕竟我当时费解了好一会儿时间呢. 首先,先标明对于迷宫求解这个项目,首先我提出自己的思路,利用"穷举求解"的方法(严蔚敏老师数据结构一书中提到,一开始不知方法其名.)其实简单来说就是一条路一条路去试,当然不能随便试,我的方法是按照从入口出发,顺一个方向向前探索,走得通就继续向前走:否则留下标记沿原路退回并换一个方向继续探索,直到所有的路都走完为止.还是用栈的

  • Java数据结构之栈的基本定义与实现方法示例

    本文实例讲述了Java数据结构之栈的基本定义与实现方法.分享给大家供大家参考,具体如下: 一.概述: 1.基本概念: 栈是一种数据结构,是只能在某一端插入和删除的特殊线性表.它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来). 栈是允许在同一端进行插入和删除操作的特殊线性表.允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom):栈底固定,而栈顶 浮动:栈中元素个数为零时称为空栈.插入一般

  • C++ 自定义栈实现迷宫求解

    C++ 自定义栈实现迷宫求解 一:迷宫求解 是一个锻炼我们的算法求解能力的问题,它的实现方法有很多:今天我们就介绍其中的用栈求解的方法. 二:什么是栈: 大家应该都有往袋子里装东西的经历,在往袋子里装满东西之后,当我们去取的时候,总是先从最后放进去的东西的地方去取.也就是后进先出(FILO).虽然栈的单向性用起来会没有链表那样可以在任意位置对数据进行操作,但是正因为如此栈也带来了很大的方便. 三:迷宫求解 现在我们要在下面的迷宫寻找一条可行的路径 1 1 1 1 1 1 1 1 1 1 1 0

  • Python常见数据结构之栈与队列用法示例

    本文实例讲述了Python常见数据结构之栈与队列用法.分享给大家供大家参考,具体如下: Python常见数据结构之-栈 首先,栈是一种数据结构.具有后进先出特性. #栈的实现 class Stack(): def __init__(self,size): self.stack=[] self.size=size self.top=-1 def push(self,content): if self.Full(): print "Stack is Full" else: self.sta

  • Java编程用栈来求解汉诺塔问题的代码实例(非递归)

    [题目] 汉诺塔问题比较经典,这里修改一下游戏规则:现在限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间.求当塔有N层的时候,打印最优移动过程和最优移动总步数. [解答] 上一篇用的是递归的方法解决这个问题,这里我们用栈来模拟汉诺塔的三个塔,也就是不用递归的方法 原理是这样的:修改后的汉诺塔问题不能让任何塔从左直接移动到右,也不能从右直接移动到左,而是要经过中间,也就是说,实际上能做的动作,只有四个:左->中,中->左,中->右,右->中 用栈

  • Java数据结构之栈与队列实例详解

    目录 一,栈 1,概念 2,栈的操作 3,栈的实现  4,实现mystack 二,队列 1,概念  2,队列的实现  3,实现myqueue 栈.队列与数组的区别? 总结 一,栈 1,概念 在我们软件应用 ,栈这种后进先出数据结构的应用是非常普遍的.比如你用浏 览器上网时不管什么浏览器都有 个"后退"键,你点击后可以接访问顺序的逆序加载浏览过的网页.   很多类似的软件,比如 Word Photoshop 等文档或图像编 软件中 都有撤销 )的操作,也是用栈这种方式来实现的,当然不同的

  • c语言数据结构之栈和队列详解(Stack&Queue)

    目录 简介 栈 一.栈的基本概念 1.栈的定义 2.栈的常见基本操作 二.栈的顺序存储结构 1.栈的顺序存储 2.顺序栈的基本算法 3.共享栈(两栈共享空间) 三.栈的链式存储结构 1.链栈 2.链栈的基本算法 3.性能分析 四.栈的应用——递归 1.递归的定义 2.斐波那契数列 五.栈的应用——四则运算表达式求值 1.后缀表达式计算结果 2.中缀表达式转后缀表达式 队列 一.队列的基本概念 1.队列的定义 2.队列的常见基本操作 二.队列的顺序存储结构 1.顺序队列 2.循环队列 3.循环队列

  • Java 数据结构算法Collection接口迭代器示例详解

    目录 Java合集框架 Collection接口 迭代器 Java合集框架 数据结构是以某种形式将数据组织在一起的合集(collection).数据结构不仅存储数据,还支持访问和处理数据的操作 在面向对象的思想里,一种数据结构也被认为是一个容器(container)或者容器对象(container object),它是一个能存储其他对象的对象,这里的其他对象常被称为数据或者元素 定义一种数据结构从实质上讲就是定义一个类.数据结构类应该使用数据域存储数据,并提供方法支持查找.插入和删除等操作 Ja

  • java 数据结构之栈与队列

    java 数据结构之栈与队列 一:对列 队列是一种先进先出的数据结构 实现代码: package Queue; /* * 使用java构建队列,并模拟实现队列的入队和出对方法 */ public class Queue { //队列类 private int maxSize; //定义队列的长度 private int[] arrQueue; //队列 private int rear; //定义队列的尾指针 private int front; //定义队列的头指针 private int e

随机推荐