006 数据结构_栈——“C”

前言

小留言:哈喽!各位CSDN的uu们,我是你的好友Fan_558,本文是Fan——数据结构与算法学习之路专栏的第6篇文章,本文采用数组的形式实现栈,希望我的文章可以给您带来一定的帮助

在这里插入图片描述

本文已通过如下测试用例,请放心学习哦!

void Test1()
{
	Stack ps;				//通过结构体类型创建结构体变量
	StackInit(&ps);			//初始化
	StackPush(&ps, 1);		//入栈
	StackPush(&ps, 2);		//入栈
	printf("元素个数为:%d\n ", StackSize(&ps)); 	//获取元素个数
	StackPush(&ps, 3);		//入栈
	StackPush(&ps, 4);		//入栈
	StackPush(&ps, 5);		//入栈
	while (!StackEmpty(&ps))
	{
		printf("%d ", StackTop(&ps));
		StackPop(&ps);			//出栈
	}
	printf("\n");
	StackDestroy(&ps);
}
void Test2()
{
	Stack ps;				//通过结构体类型创建结构体变量
	StackInit(&ps);			//初始化
	StackPush(&ps, 1);		//入栈
	StackPush(&ps, 2);		//入栈
	StackPush(&ps, 3);		//入栈
	StackPop(&ps);			//出栈
	StackPop(&ps);			//出栈
	printf("元素个数为:%d\n", StackSize(&ps)); 	//获取元素个数
	StackPop(&ps);			//出栈
	printf("元素个数为:%d\n", StackSize(&ps)); 	//获取元素个数

	//为空
//	StackPop(&ps);			//出栈
//	printf("元素个数为:%d\n", StackSize(&ps)); 	//获取元素个数
	StackDestroy(&ps);
}
int main()
{
	Test1();
	Test2();
	return 0;
}

在这里插入图片描述

什么是栈

栈(Stack)是一种数据结构,它类似于一堆叠在一起的盘子,只能从最上面取出盘子,而不能从中间或底部取出。栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构,即最后放入栈的元素最先被取出。栈通常有两个操作:push(压栈)和pop(出栈)。push操作会在栈的顶部添加一个元素,而pop操作则会在栈的顶部删除一个元素。

实现步骤

1、初始化——栈

typedef int STDataType;
typedef struct Stack
{
	STDataType* _a;
	int _top; // 栈顶
	int _capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps)
{
	ps->_a = NULL;
	ps->_capacity = ps->_top = 0;
}

2、判空——栈

// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps)
{
	return ps->_top == 0;
}

解析:若ps->_top == 0返回true,否则返回false,这里注意下逻辑
assert(!StackEmpty(ps)); 若为0,返回true,!true为false。
为了提高这句代码的可读性,我们才这样写。

3、入栈

// 入栈
void StackPush(Stack* ps, STDataType data)
{
	if (ps->_top == ps->_capacity)				//扩容
	{
		STDataType newcapacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2;
		STDataType * tmp = (STDataType * )realloc(ps->_a, newcapacity * sizeof(Stack));
		if (tmp == NULL)			
		{
			perror("realloc fail");			//打印错误信息
			return;		//若开辟失败,程序结束
		}
		ps->_capacity = newcapacity;
		ps->_a = tmp;
	}
	 ps->_a[ps->_top] = data;
	 ps->_top++;
}


4、出栈

// 出栈
void StackPop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));    //判空,为假报错
	ps->_top--;
}

5、获取有效元素个数——栈

// 获取栈中有效元素个数
int StackSize(Stack* ps)
{
	assert(ps);
	STDataType size = ps->_top;
	return size;
}

6、销毁——栈

// 销毁栈
void StackDestroy(Stack* ps)
{
	free(ps->_a);
	ps->_a = NULL;
	ps->_capacity = ps->_top = 0;
}

小结

倘若本文有遗漏疏忽之处,还需要你指正,以便今后改进!祝你天天开心啦!欢迎到我的博客留言,我会尽力解答,希望能给你一些帮助!

posted @ 2023-05-18 00:21  Fan_558  阅读(2)  评论(0编辑  收藏  举报  来源