栈(C语言)

定义

栈(Stack)是一种特殊的线性表,是后进先出(LIFO,Last In First Out)的数据结构。这意味着最后一个进入栈的元素会最先被弹出。栈通常有两个主要操作:压栈(push)和弹栈(pop)。压栈操作将元素放入栈顶,而弹栈操作将栈顶元素移除并返回。栈还支持查看栈顶元素但不移除的操作(peek)。

栈的应用

  • 栈是一种相对简易的数据结构,他的应用领域十分广泛,包括以下方面:

    1.函数调用:在C语言中,函数和局部变量是在栈空间中维护的,函数的调用会用到各种压栈和弹栈的操作,例如传参过程就是在函数栈顶压栈。
    2.括号的匹配,在处理字符串中的括号匹配问题时,我们可以使用栈来检查每个括号是否与他的配对括号匹配
    3.ctrl z撤回等操作
    4.双端队列
    5.解决 多皇后问题
  • 以上只是栈用法的冰山一角,更多用法还请读者以探索的眼光取寻找!!

栈的基本功能及实现

  • 栈作为线性表的一种,他的实现方式有多种,包括数组栈和链表栈,这里演示数组栈的实现,若想实现链表栈,推荐使用单链表实现。

初始化和销毁

  • 创建一个栈
typedef int STDataType;
typedef struct Stack
{
	STDataType* _a;
	int _top;		// 栈顶
	int _capacity;  // 容量 
}Stack;
  • 初始化
void StackInit(Stack* ps)
{
	assert(ps);
	ps->_a = NULL;
	ps->_capacity = 0;
	ps->_top = -1;
}
  • 销毁
void StackDestroy(Stack* ps)
{
	free(ps->_a);
	ps->_a == NULL;
	ps->_capacity = 0;
	ps->_top = -1;
}

压栈和弹栈

  • 压栈
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	if (ps->_top + 1 == ps->_capacity)
	{
		int newcapacity = ps->_capacity == 0 ? 4 : 2 * ps->_capacity;
		STDataType* tmp = (STDataType*)realloc(ps->_a, newcapacity * sizeof(Stack));
		if (!tmp)
		{
			perror("realloc fail!");
			return;
		}
		ps->_a = tmp;
		ps->_capacity = newcapacity;
	}
	ps->_a[++ps->_top] = data;
}
  • 弹栈
void StackPop(Stack* ps)
{
	assert(ps && ps->_top != -1);
	ps->_top--;
}

获取栈顶元素

STDataType StackTop(Stack* ps)
{
	return ps->_a[ps->_top];
}

判断栈是否为空以及返回栈的有效数据个数

  • 判空
int StackEmpty(Stack* ps)
{
	return ps->_top + 1;
}
  • 返回有效数据个数
int StackSize(Stack* ps)
{
	return ps->_top + 1;
}
  • 以上就是这期栈(C语言)的全部内容了,回见!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值