因为前面贴了一片关于迷宫的博客,所以现在来讲解一下迷宫的底层实现----顺序栈的实现。
首先我们先明确自己的目标----栈!
栈:什么是栈?又该怎么理解呢?
①栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出)
③栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。
以下为栈数据入栈和出栈的图示:
以下为栈创建的头文件:
#ifndef SEQSTACK_H
#define SEQSTACK_H
#define STACKSIZE 100 //预编译空间大小为100
typedef int SElemType;
struct SeqStack
{
SElemType *data; //数据类型为int
int maxsize;
int top; //栈的top计数
};
void Init_Stack(SeqStack &st);
void Destroy_Stack(SeqStack &st);
void Stack_Clear(SeqStack &st);
bool Stack_Empty(SeqStack &st);
bool Stack_Full(SeqStack &st);
int Stack_Size(SeqStack &st);
bool Stack_Push(SeqStack &st,const SElemType &x);
bool Stack_Pop(SeqStack &st, SElemType &x);
#endif
主要还是结构体的建立,和函数的预编译。(再说一遍结构体尤其重要,好的结构体在后面构建函数时会省力不少!!!)
以下是栈的主要功能函数创建:
#include"Stack.h"
bool Stack_Resize(SeqStack &st)//如果栈的大小不够,扩容操作
{
SElemType *s = (SElemType*)malloc(sizeof(SElemType)*st.maxsize * 2);
if(NULL == s) return false;
for(int i = 0;i<= st.top;++i)
{
s[i] = st.data[i];
}
free(st.data);
st.data = s;
st.maxsize = st.maxsize * 2;
return true;
}
void Init_Stack(SeqStack &st)//栈的初始化
{
st.maxsize = STACKSIZE;
st.top = -1;
st.data = (SElemType*)malloc(sizeof(SElemType)*st.maxsize);
if(NULL == st.data)
{
exit(0);
}
}
void Destroy_Stack(SeqStack &st)//栈的摧毁
{
free(st.data);
st.data = NULL;
st.maxsize = 0;
st.top = -1;
}
void Stack_Clear(SeqStack &st)//栈的数据清除
{
st.top = -1;
}
bool Stack_Empty(SeqStack &st)//栈的判空
{
return Stack_Size(st) == 0;
}
bool Stack_Full(SeqStack &st)//栈的判满
{
return Stack_Size(st) == st.maxsize;
}
int Stack_Size(SeqStack &st)//栈的现存大小
{
return st.top + 1;
}
bool Stack_Push(SeqStack &st,const SElemType &x)//入栈
{
if(Stack_Full(st) && ! Stack_Resize(st))
{
return false;
}
st.data[++st.top] = x;
return true;
}
bool Stack_Pop(SeqStack &st, SElemType &x)//出栈
{
if(Stack_Empty(st))
{
return false;
}
x = st.data[st.top--];
return true;
}
以上就是栈的构造,希望能帮到大家。