C语言实现数据结构数组栈

什么是数组栈

栈是一种特殊的线性表,必须满足"LIFO"(last in fast out),也就是后进先出的原则, 类似于手枪弹夹,只能在栈顶添加或删除数据,向栈顶添加数据叫做压栈(Push),从栈顶删除数据叫出栈(Pop),除此之外,栈还应该能够读取栈顶的数据,获取栈的大小,以及判断栈体是否为空。

C语言能实现数组栈和链式栈,

其中用C语言中结构体和数组模拟实现,能完成栈的各种操作的栈结构,就称为 数组栈。

具体实现:

1.定义结构体Stack来模拟栈体:

typedef int StackDataType;

typedef struct Stack {
	StackDataType* arr;
	size_t top;
	size_t capacity;
}Stack;

结构体中:

arr :用来存数据;

top:用来表示栈顶;

capacity:数组大小;

2.栈操作函数的声明:

#include//预处理 
#include
#include
#include

#define InitCapacity 2//设置初始栈容量


void StackInit(Stack* ps);//初始化

void StackDestory(Stack* ps);//销毁

void StackPush(Stack* ps, StackDataType x);//压栈

void StackPop(Stack* ps);//出栈

bool StackEmpty(Stack* ps);//判断是否为空栈

StackDataType StackTop(Stack* ps);//访问栈顶元素

size_t StackSize(Stack* ps);//获取栈的大小

3.栈操作函数的定义 :

初始化:

void StackInit(Stack* ps) 
{
	assert(InitCapacity);
	assert(ps);
	ps->arr = (StackDataType*)malloc(InitCapacity * sizeof(StackDataType));
	ps->top = 0;
	ps->capacity = InitCapacity;
}

为数组开辟空间,初始化结构体的各项值。

销毁(Deatory):


void StackDestory(Stack* ps) 
{
	assert(ps);
	free(ps->arr);
}

销毁栈,释放内存。 

压栈(Push):

void StackPush(Stack* ps, StackDataType x) 
{
	assert(ps);
	if (ps->top == ps->capacity) {//判断是否需要扩容
		StackDataType* ret;
		assert(ret = (StackDataType*)realloc(ps->arr, (unsigned int)2 * ps->capacity * sizeof(StackDataType)));
		ps->arr = ret;
		ps->capacity *= 2;
	}
	ps->arr[ps->top++] = x;//从栈顶压入指定元素
}

先判断数组容量看是否需要扩容,再将元素从栈顶压入。 

出栈(Pop):

void StackPop(Stack* ps)
{
	assert(ps);
	if (ps->top) {
		ps->top--;
	}
}

栈顶下移一位,视为弹出了原栈顶位置的元素。

判断是否为空栈:

bool StackEmpty(Stack* ps)
{
	assert(ps);
	return ps->top==0;
}

判断是否为空栈,返回布尔类型值。

访问栈顶元素:

StackDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(ps->top);
	return ps->arr[ps->top-1];
}

返回栈顶元素的值。 

获取栈的大小:

size_t StackSize(Stack* ps)
{
	assert(ps);
	return ps->top;
}

返回栈中的元素个数。

 文章源码:

leyi_999/数据结构练习 - Gitee.comhttps://gitee.com/leyi999/data-structure-exercise/tree/master/%E6%95%B0%E7%BB%84%E6%A0%88

你可能感兴趣的:(数据结构,C语言,c语言,数组,数据结构)