/************************************************************************/
/* 数据结构:栈应用:求解迷宫问题 */
/* 挑灯看剑-shuchangs@126.com 2010-10 */
/* 云歌国际(Cloud Singers International) www.cocoral.com */
/************************************************************************/
#include <stdio.h>
#include <malloc.h>
#include "core.h"
/************************************************************************/
/* 以下是栈基本操作:进栈、出栈、打印栈 */
/************************************************************************/
//定义当前位置(迷宫足迹)数据结构
typedef struct CURRENTPOSITION
{
struct CURRENTPOSITION* up, * down, * left, * right; //四邻情况
int visited; //是否被访问:1表示被访问,0表示未被访问
int data; //数据域
int x, y; //位置坐标
}CurPos;
//结点数据结构
typedef struct NODE
{
struct CURRENTPOSITION data; //使用迷宫中的足迹数据结构作为数据域
struct NODE* next;
struct NODE* prior;
}Node, * NodePointer;
//栈元数据结构
typedef struct STACK
{
int len;
struct NODE* top;
struct NODE* base;
}Stack, * StackPointer;
void main()
{
//*************函数原型******************
Status StackIn(StackPointer SP, struct CURRENTPOSITION e);
//void autoStack(StackPointer SP, int n);
void StackPrint(Stack S, char tag);
Status StackOut(StackPointer SP, NodePointer NP);
void mazeExperiment();
//*************函数原型******************
//迷宫实验
mazeExperiment();
}
//进栈操作,结点作为栈顶元素入栈
Status StackIn(StackPointer SP, struct CURRENTPOSITION e)
{
static Status StackIsEmpty(Stack S);//函数原型
Status status = ERROR;
NodePointer p = NULL;//遍历指针,非游离指针
NodePointer NP = (NodePointer) malloc(sizeof(Node));
NP->data = e;
//进行预处理
if (!StackIsEmpty(*SP))
{
//将结点追加为栈顶元素
p = SP->top; //p指向栈顶
p->next = NP;
NP->prior = p;
NP->next = NULL;
SP->top = NP;
SP->len += 1; //长度加1
//puts("进栈成功!");
status = OK;
}
else
{
SP->base = SP->top = NP;
NP->next = NP->prior = NULL;
SP->len = 1; //长度为1
//puts("进栈成功!");
status = OK;
}
return status;
}
static Status StackIsEmpty(Stack S)
{
if (S.len == 0 || S.base == NULL || S.top == NULL)
return TRUE;
else
return FALSE;
}
//出栈操作,并用结点返回该值
Status StackOut(StackPointer SP, NodePointer NP)
{
Status status = ERROR;
NodePointer p = SP->top; //p指向栈顶
if (!StackIsEmpty(*SP))
{
if (SP->len == 1)
{
SP->base = SP->top = NULL;
SP->len = 0; //长度为0
NP->data = p->data;
NP->next = p->next;
NP->prior = p->prior;
//puts("出栈成功!");
status = OK;
}
else
{
p->prior->next = NULL;
SP->top = p->prior;
SP->len -= 1; //长度减1
NP->data = p->data;
NP->next = p->next;
NP->prior = p->prior;
//puts("出栈成功!");
status = OK;
}
}
else
{
//puts("出栈失败!栈为空!");
status = ERROR;
}
free(p); //p为游离结点,最后释放p内存
return status;
}
//栈打印操作,tag参数IN SET{'B','T'}
void StackPrint(Stack S, char tag)
{
static Status StackIsEmpty(Stack S);//函数原型
NodePointer p = NULL;
COUNT i = 1;
COUNT n = S.len;
printf("栈长度:%d\n", n);
if (!StackIsEmpty(S)) //如果线性链表非空
{
switch (tag)
{
case 'B':
p = S.base;
puts("打印结点信息(栈底到栈顶):");
for (i = 1; i <= n; i++)
{
printf("[%d] foot[%d][%d] = %d\n", i, p->data.x, p->data.y,
p->data.data);
p = p->next;
}
break;
case 'T':
p = S.top;
puts("打印结点信息(栈顶到栈底):");
for (i = n; i >= 1; i--)
{
printf("[%d] foot[%d][%d] = %d\n", i, p->data.x, p->data.y,
p->data.data);
p = p->prior;
}
break;
default:
puts("打印失败!");
break;
}
}
else //如果栈为空
{
puts("打印失败!栈为空!");
}
free(p);//p为游离结点,最后释放p内存
}
//下接版面 《数据结构:栈应用:求解迷宫问题2》
分享到:
相关推荐
在本主题“数据结构-栈的应用-迷宫求解”中,我们将探讨如何利用栈来解决迷宫路径搜索的问题。 首先,迷宫求解是一个典型的图遍历问题,可以通过深度优先搜索(DFS)或广度优先搜索(BFS)等算法来解决。在这里,...
**实验背景**:本实验旨在加深学生对数据结构中栈和队列的理解,并通过实际编程应用的方式掌握这两种数据结构的特点及其应用场景。栈和队列作为两种基本的数据结构,在算法设计、程序开发等多个领域都有着广泛的应用...
实验中,我们将首先实现一个以链表作为存储结构的栈类型,然后编写一个求解迷宫的非递归程序。 一、实验目的和要求 实验目的: * 应用栈结构来解决应用问题,加深对栈结构特点的认识和应用。 基本要求: * 首先...
本主题聚焦于“C语言数据结构顺序栈之迷宫求解”,这是一个结合了基本数据结构和算法的有趣应用。我们将深入探讨顺序栈、迷宫问题以及如何使用C语言实现迷宫求解算法。 顺序栈是一种线性数据结构,它的元素按照...
总结,本实验报告详细阐述了如何使用栈来解决迷宫问题,涵盖了从需求分析到详细设计的全过程,以及关键数据结构栈的实现。通过迷宫生成、路径查找等模块,展示了如何利用栈进行深度优先搜索来解决实际问题。
从给定的代码片段来看,这是一段使用C语言实现迷宫最短路径求解的程序,主要通过队列(Queue)与栈(Stack)的数据结构来完成算法的设计与实现。下面将对这段代码涉及的关键知识点进行详细解析。 ### C语言中的数据...
总之,“栈的应用 - 迷宫求解”是一个极好的学习资源,它将理论与实践相结合,帮助学生将数据结构的知识应用于实际问题,提升其编程和算法设计能力。通过对压缩包中的“maze”文件进行分析和实现,可以加深对栈和...
迷宫求解是数据结构课程设计中一个典型的问题,旨在训练学生对递归和回溯等算法的理解和应用。在本设计中,我们将探讨两种方法来解决这一问题:非递归算法和递归算法。 一、问题描述 迷宫求解的基本任务是从入口...
数据结构中的栈是一种非常重要的抽象数据类型,它遵循“后进先出”(LIFO,Last In First Out)的原则。在解决实际问题时,栈的特性往往被巧妙地利用,例如在迷宫求解的问题中。本文将深入探讨栈如何应用于迷宫求解...
这个项目可以帮助我们深入理解如何利用Java来处理和解决复杂的数据结构问题,特别是与迷宫相关的路径寻找算法。 首先,我们要了解什么是迷宫。迷宫是一种复杂的问题空间,通常由一系列相互连接的通道构成,具有起点...
总结来说,C语言数据结构中的顺序栈在迷宫求解最短路径问题中发挥着核心作用。通过对顺序栈的理解和熟练运用,我们可以设计高效的算法解决实际问题。对于学习者而言,深入理解和实践这部分内容将对提升编程技能和...
- **深度优先搜索(DFS)**:通过栈数据结构进行回溯,从起点开始,不断探索迷宫的未访问区域,直到找到终点或无法前进时回溯。 - **广度优先搜索(BFS)**:使用队列数据结构,从起点开始,逐层遍历迷宫,优先探索...
在数据结构的学习中,迷宫问题是一个经典的算法挑战,它涉及到路径寻找、图遍历以及栈数据结构的应用。本文将详细解析如何使用Java语言,基于栈结构来解决此类问题。 首先,我们需要理解栈(Stack)的基本概念。栈...
在数据结构课程设计中,迷宫问题的求解是一个经典的实践课题,它涉及到深度优先搜索(DFS)、广度优先搜索(BFS)等算法。在这个项目中,我们使用C语言作为编程工具,并在VC++6.0开发环境中进行实现。 迷宫问题的基本...
在本话题中,我们将深入探讨数据结构之一——栈,并以其在解决“走迷宫”问题中的应用为例进行讲解。 栈是一种特殊的线性数据结构,遵循“后进先出”(LIFO)原则,类似于日常生活中的叠盘子。栈的主要操作有压入...
数据结构课程设计中的“迷宫求解”是一个典型的图遍历问题,主要涉及到栈这一数据结构的应用。在计算机科学中,迷宫可以被视为一个二维矩阵,每个节点代表一个位置,而边则表示相邻的位置。迷宫求解的目标是从起点到...
通过以上分析可以看出,“数据结构之迷宫求解C++”主要涵盖了栈这一关键数据结构及其在迷宫求解中的应用。栈作为深度优先搜索算法的基础,使得程序能够有效地管理和追踪探索过程中的路径信息。此外,迷宫的表示方法...
迷宫求解问题是一个典型的数据结构应用案例,涉及到路径搜索算法。在这个场景中,我们使用严蔚敏教授的经典教材《数据结构》中的方法,用C语言来实现迷宫的求解。下面将详细探讨相关知识点。 首先,迷宫可以被抽象...
从给定的代码片段和描述来看,这是一段用C语言实现的迷宫求解算法,涉及到了数据...通过对代码的理解,不仅能够掌握迷宫求解的基本思路,还能深入理解栈在实际问题中的应用,这对于学习数据结构和算法具有重要的意义。