数据结构学习之栈(C顺序表实现)

本文详细介绍了使用C语言实现的顺序表栈,包括栈的声明、初始化、扩容、入栈、出栈、打印栈顶元素、检查是否为空以及栈的销毁过程。
摘要由CSDN通过智能技术生成

数据结构学习之栈(C顺序表实现)

总纲

  1. 栈的声明
  2. 栈的初始化
  3. 栈的扩容
  4. 入栈
  5. 出栈
  6. 打印栈
  7. 获取栈顶元素
  8. 检查是否为空
  9. 栈的销毁

一. 栈的声明

由于存储的类型可以是任意的,所以用typedef将类型用一个变量表示

typedef int type;
typedef struct ArrStack
{
	int size;
	int capacity
	type* arr;	
	int top; // 栈顶元素的索引 
}Astack;

这里其实和顺序表很像了


二. 栈的初始化

首先想一想初始化后的栈是啥样子的

  • size为0,因为没有元素
  • capacity不为0,有一定的容量
  • top为-1,表示此时栈中没有元素

不要忘记检查分配空间是否成功

void init(Astack* stack, int capa)// capa是初始化的栈的容量
{
	stack->arr = (type*)realloc(capa, sizeof(type) * capa);
	if (stack->arr != NULL)//检查空间是否分配成功
	{
		stack->size = 0;
		stack->capacity = capa;
		stack->top = -1;
	}
	else
	{
		printf("SpaceNotEnough");
		return;
	}
} 

三. 栈的扩容

入栈之前要检查容量够不够

void ifenlarge(Astack* stack)
{
	if (stack->size == stack->capacity - 1) // 表示入栈之前栈顶到容量最大值了
	{
		int new_capacity = stack->capacity * 2;
		type* tmp = (type*)realloc(stack->arr, new_capacity * sizeof(type);
		if (tmp != NULL)  // 不要忘记检查空间是否分配成功
		{
			stack->arr = tmp;
			stack->capacity = new_capacity;	
		}
		else
		{
			printf("ReallocError");
			return;
		}
	} 
}

四. 入栈

入栈要尤其注意空间够不够

void Push(Astack* stack, type x) // x是要插入的元素
{
	ifenlarge(stack);
	stack->top++;
	stack->arr[stack->top] = x;
	stack->size++; // 长度要加一
}

五. 出栈

出栈要注意边界, 如果已经为空了就出不来了
不用表明元素和索引,直接从栈顶出去就行了

void Pop(Astack* stack)
{
	stack->top--;
	stack->size--;
}

这里注意不用将出栈的元素重置,反正再次入栈时还会修改


六. 打印栈

循环打印

void print(Astack* stack)
{
	if (stack->size == 0) // 注意栈为空时打印不了捏
	{
		printf("no elements\n");
		return;
	}
	for (int i = 0; i < stack->size; i++)
	{
		printf("%d ", stack->arr[i]);
	}
}

七. 获取栈顶元素

因为top就是栈顶的索引,所以可以利用top直接获取
进行操作之前先判断有无元素

type Top(Astack* stack)
{
	if (stack->top == -1)
	{
		return -1024; // 表示错误
	}
	return stack->arr[stack->top];
}

八. 检查是否为空

这个直接看top就行了

bool isempty(Astack* stack)
{
	if (stack->top == -1)
	{
		return true; // true代表为空
	}
	return false;
}

其实也能看size,这个随便了


九. 栈的销毁

释放申请的空间并置空

void Destroy(Astack* stack)
{
	free(stack->arr);
	stack->arr = NULL;
	stack->size = 0;
	stack->capacity = 0;
	stack->top = -1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值