基于C语言的栈实现

Posted 胖仙人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于C语言的栈实现相关的知识,希望对你有一定的参考价值。

->Gitee源码点击这里<-
之前所实现的顺序表和链表都成为线性表,即他们的从逻辑上来看是连续的,线性的,按顺序的。
栈是一种特殊的线性表,其实现要基于顺序表或者链表,相比之下用顺序表来实现更优;
而和顺序表区别在于,栈不支持随机位置的数据插入和删除,入栈的数据遵循后进先出的原则。
栈的逻辑结构示意图:

接下来我们使用顺序表来实现一个栈。

首先定义一个结构体,该结构体包含了栈的相关信息:

typedef int STDatatype;
typedef struct Stack

	STDatatype* a; //指向动态开辟的栈
	int top = 0; //栈顶
	int capacity = 0;//栈容量
;

接着对栈进行初始化

void StackInit(Stack* pst)

	pst->a = (STDatatype*)malloc(sizeof(STDatatype) * 4);//给定栈的初始大小
	if (pst->a == NULL)
	
		printf("Init Failed\\n");
		exit(-1);
	
	pst->top = 0;
	pst->capacity = 4;

栈在处理数据时,只需要两个接口即可,即入栈接口和出栈接口。入栈接口的本质就是顺序表的尾插;出栈接口的本质就是顺序表的尾删
一、入栈接口

void StackPush(Stack* pst, STDatatype data)

	assert(pst);
	//查询栈是否已满
	if (pst->top == pst->capacity)
	
		Stack* newa = (STDatatype*)realloc(pst->a, sizeof(STDatatype) * pst->capacity * 2);
		if (newa == NULL)
		
			printf("realloc failed\\n");
			exit(-1);
		
		pst->a = newa;
		pst->capacity *= 2;
	
	pst->a[pst->top] = data;
	pst->top++;

二、出栈接口
这里要注意,栈为空时,出栈接口不希望被调用
所以我们先设计一个判断栈是否为空的接口

bool StackIsEmpty(Stack* pst)

	assert(pst);
	return pst->top == NULL;

接着在出栈接口中,借助判空接口添加断言

void StackPop(Stack* pst)

	assert(pst);
	assert(!StackIsEmpty(pst)); //调用删除接口栈不能为空
	pst->top--;

三、获取栈顶元素

STDatatype StackTop(Stack* pst)

	assert(pst);
	assert(!StackIsEmpty(pst));
	return pst->a[pst->top - 1];

四、栈中有效元素的个数

int StackSize(Stack* pst)

	assert(pst);
	return pst->top;

五、栈的销毁
不要忘记,栈时动态开辟的,使用完毕要销毁空间

void StackDestroy(Stack* pst)

	free(pst->a);
	pst->capacity = 0;
	pst->top = 0;


对于栈的一些说明:
对于栈,不设计打印接口,若想通过打印来看到栈中数据,需要使用StackTop()获取栈顶元素接口和StackPop()出栈接口,获取栈顶元素,打印,然后删除该栈顶元素,如此循环,当所有元素被打印时,栈已经为空了:

//栈中已经依次入栈1,2,3,4
//打印栈中元素
int main()

	Stack mystack;
	StackInit(&mystack);
    while (!StackIsEmpty(&mystack))
	
		printf("%d ", StackTop(&mystack));
		StackPop(&mystack);
	
	StackDestroy(&mystack);


数据入栈的顺序为1,2,3,4,出栈的顺序为4,3,2,1,即最后进栈的数据会最先出栈,这就是后进先出原则的含义

以上是关于基于C语言的栈实现的主要内容,如果未能解决你的问题,请参考以下文章

基于C语言的栈实现

C语言中的栈、堆是啥?

C语言使用栈实现String类型的两个大数相加

java9新特性-Stack Walking-当前线程栈信息

栈导论

java中的栈