您现在的位置是:群英 > 开发技术 > 编程语言
C语言栈的原理如何理解,怎么实现栈
Admin发表于 2022-04-29 16:43:05853 次浏览
这篇文章给大家分享的是“C语言栈的原理如何理解,怎么实现栈”,文中的讲解内容简单清晰,对大家认识和了解都有一定的帮助,对此感兴趣的朋友,接下来就跟随小编一起了解一下“C语言栈的原理如何理解,怎么实现栈”吧。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的 代价比较小。如下图:

下面用顺序表(数组)来实现栈;

建立一个顺序表结构:

typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top; //表示栈顶
int capacity;//表示容量,当容量满时,扩容;
}ST;

创建一个结构体变量:ST st;在传数据之前要先初始化;不然当你没赋值就直接访问时会出现乱码或者报警告;

//初始化
void StackInit(ST* ps)
{
	assert(ps);//断言,保证传进来的非空;
	ps->a = NULL;//先将顺序表指针指向空;
	ps->top = 0;//栈顶位置表示0位置;
	ps->capacity = 0;//容量为0;
}

接下来就是向栈内传数据(压栈),要传结构体地址和要传的数据;

//压栈
void StackPush(ST* ps, STDataType x)
{
	assert(ps);
    //判断:数据从下标0开始,因为pot表示该插入的栈顶的位置,也是压栈的个数
    //一次插入一个数据,所以数据数量与总容量相同时,就需要扩容
	if (ps->top == ps->capacity)
	{
		//扩容,扩二倍
        //使用三目运算符判断,当是第一次扩容时,用二倍没变化,所以固定开辟4个空间;
		int retcapa = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* ret = (STDataType*)realloc(ps->a, sizeof(STDataType)*retcapa);
		if (ret != NULL)
		{
			ps->a = ret;
			ps->capacity = retcapa;
		}
		else
		{
			printf("realloc开辟失败,退出!");
			exit(-1);
		}
	}
    //扩容完,更新数据;
	ps->a[ps->top] = x;
	ps->top++;
}

有压栈就有出栈;出栈用两个接口。1.返回栈顶数据 2.出栈

因为有时候只需要访问栈顶数据不需要出栈,如果想出栈又想返回数据,就先调用1,再调用2;

//返回栈顶元素;
STDataType StackTop(ST* ps)
{
	assert(ps);
 
    //直接断言要求栈中必须要有数据;
	assert(ps->top > 0);
 
	return ps->a[ps->top - 1];
}
 
//出栈,顺序表直接把下标减一即可
void StackPop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	ps->top--;
}

有时候还需要返回栈中元素

//返回栈中元素个数;
int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

在一些复杂结构中要直接调用查看栈中是否有数据,判断栈是否为空;

//判断栈中元素是否为空,返回布尔类型
bool StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;//注意这里是没有数据是返回true;
}

用动态开辟的空间就必须手动释放

//释放;顺序表释放头指针即可
void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

看一下如何调用的:

int main()
{
	ST st;
	StackInit(&st);
 
	StackPush(&st, 1);
	StackPush(&st, 2);
	StackPush(&st, 4);
	StackPush(&st, 5);
	StackPush(&st, 7);
	
    printf("%d\n",StackTop(&st));
	
    StackPop(&st);
	StackPush(&st, 8);
	
	printf("%d\n",StackTop(&st));
    StackPop(&st);
 
	StackDestroy(&st);
	return 0;
}

以上就是关于“C语言栈的原理如何理解,怎么实现栈”的介绍了,感谢各位的阅读,希望文本对大家有所帮助。如果想要了解更多知识,欢迎关注群英网络,小编每天都会为大家更新不同的知识。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: 栈的原理
相关信息推荐
2022-10-09 18:13:56 
摘要:前一阵子抖音和微博开始陆续上了IP归属地的功能,引起了众多热议,有大批在国外的老铁们开始"原形毕露",被定位到国内来,那么IP归属到底是怎么实现的呢?那么网红们的归属地到底对不对呢
2022-10-11 09:18:03 
摘要:本文主要介绍了idea web项目没有小蓝点的的两种解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022-09-05 17:44:45 
摘要:这篇文章主要介绍了tp5.1 框架查询表达式用法,结合实例形式详细分析了tp5.1 框架常用查询表达式功能、定义、用法及操作注意事项,需要的朋友可以参考下
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部