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<stdio.h>//预处理 
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>

#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

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值