c语言 栈的实现

因为前面贴了一片关于迷宫的博客,所以现在来讲解一下迷宫的底层实现----顺序栈的实现。

首先我们先明确自己的目标----栈!

栈:什么是栈?又该怎么理解呢?

①栈(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;
}

以上就是栈的构造,希望能帮到大家。

猜你喜欢

转载自blog.csdn.net/qq_38361756/article/details/81290075