首页后端开发其他后端知识C语言栈的原理如何理解,怎么实现栈

C语言栈的原理如何理解,怎么实现栈

时间2024-03-28 12:06:03发布访客分类其他后端知识浏览575
导读:这篇文章给大家分享的是“C语言栈的原理如何理解,怎么实现栈”,文中的讲解内容简单清晰,对大家认识和了解都有一定的帮助,对此感兴趣的朋友,接下来就跟随小编一起了解一下“C语言栈的原理如何理解,怎么实现栈”吧。 栈 压栈...
这篇文章给大家分享的是“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语言栈的原理如何理解,怎么实现栈”的介绍了,感谢各位的阅读,希望文本对大家有所帮助。如果想要了解更多知识,欢迎关注网络,小编每天都会为大家更新不同的知识。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

C语言数据结构

若转载请注明出处: C语言栈的原理如何理解,怎么实现栈
本文地址: https://pptw.com/jishu/654928.html
Bootstrap框架是什么,如何部署环境和搭建 C语言平衡二叉树是什么,如何调整不平衡的情形

游客 回复需填写必要信息