任务描述
相关知识
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)的数据结构及相关操作函数。
DataType
结构体定义了栈中元素的数据类型,包含x
、y
和d
三个成员。SeqStack
结构体定义了顺序栈的结构,包含data
(数据元素数组指针)、top
(栈顶指针)和stacksize
(栈的当前已分配存储空间大小)三个成员。createEmptyStack_seq
函数用于创建一个空栈,接受一个参数m
表示栈的初始存储空间大小,返回一个指向顺序栈的指针。isEmptyStack_seq
函数判断栈是否为空栈,如果栈顶指针为 -1,则表示栈为空,返回 1;否则返回 0。Push_Seq
函数用于将元素入栈,将元素x
插入到栈顶位置。Pop_Seq
函数用于出栈,删除栈顶元素。Top_Seq
函数用于获取栈顶元素。