栈——迷宫求解

任务描述

相关知识

1.栈的基本操作,2.深度优先访问算法。

测试说明

测试输入:无;

预期输出: (8,9) (8,8,0) (8,7,0) (8,6,0) (8,5,0) (7,5,1) (6,5,1) (6,4,0) (6,3,0) (5,3,1) (5,2,0) (5,1,0) (4,1,1) (3,1,1) (3,2,2) (2,2,1) (1,2,1) (1,1,0) (1,0,0)

#ifndef STACK_H
#define STACK_H

typedef struct
{
	int x;
	int y;
	int d;
} DataType; // 定义数据类型 DataType

typedef struct
{
	DataType* data; // 数据元素数组指针,存储栈中的元素
	int top;       // 栈顶指针,指示栈顶元素的位置
	int stacksize; // 栈的当前已分配存储空间大小,以数据元素为单位
} SeqStack, * PSeqStack; // 顺序栈的结构体定义和指针类型定义

// 构造一个空栈
PSeqStack createEmptyStack_seq(int m)
{
	PSeqStack S = (PSeqStack)malloc(sizeof(SeqStack)); // 分配栈结构体内存空间
	if (S)
	{
		S->data = (DataType*)malloc(m * sizeof(DataType)); // 分配数据元素数组内存空间
		if (!S->data)
		{
			free(S);
			return 0;
		} // 存储分配失败
		S->top = -1;       // 初始化栈顶指针为-1,表示栈为空
		S->stacksize = m;  // 初始化栈的存储空间大小为m
	}
	return S;
}

// 若栈S为空栈,返回1;否则,返回0
int isEmptyStack_seq(PSeqStack S)
{
	return (S->top == -1 ? 1 : 0); // 如果栈顶指针为-1,表示栈为空,返回1;否则返回0
}

// 入栈
void Push_Seq(PSeqStack S, DataType x)
{
	// 插入元素x为新的栈顶元素
	S->top = S->top + 1;      // 栈顶指针加1
	S->data[S->top] = x;      // 将元素x存入栈顶位置
}

// 出栈
int Pop_Seq(PSeqStack S)
{
	// 若栈不为空,删除栈顶元素并返回1;否则返回0
	if (isEmptyStack_seq(S))
	{
		printf("\n Stack is free!");
		return 0;
	}

	S->top = S->top - 1;  // 栈顶指针减1,表示删除栈顶元素
	return 1;
}

// 取栈顶元素
DataType Top_Seq(PSeqStack S)
{
	// 若栈S不空,则返回栈顶元素;否则给出相应提示
	DataType e;
	if (isEmptyStack_seq(S))
	{
		e.x = e.y = e.d = -1; // 栈为空时,设置x、y、d为-1
		printf("\n Stack is free!");
	}
	else
	{
		e = S->data[S->top];  // 获取栈顶元素
	}
	return e;
}

#endif // !STACK_H

这段代码实现了一个顺序栈(Sequential Stack)的数据结构及相关操作函数。

  1. DataType 结构体定义了栈中元素的数据类型,包含 xyd 三个成员。
  2. SeqStack 结构体定义了顺序栈的结构,包含 data(数据元素数组指针)、top(栈顶指针)和 stacksize(栈的当前已分配存储空间大小)三个成员。
  3. createEmptyStack_seq 函数用于创建一个空栈,接受一个参数 m 表示栈的初始存储空间大小,返回一个指向顺序栈的指针。
  4. isEmptyStack_seq 函数判断栈是否为空栈,如果栈顶指针为 -1,则表示栈为空,返回 1;否则返回 0。
  5. Push_Seq 函数用于将元素入栈,将元素 x 插入到栈顶位置。
  6. Pop_Seq 函数用于出栈,删除栈顶元素。
  7. Top_Seq 函数用于获取栈顶元素。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值