C语言之栈实现(详细)

 C语言栈实现:

先把栈的C语言实现代码写出来,后续分析内存

总体而言,写栈步骤&思路:

*创建结构体变量:

1.初始化栈空间:利用malloc函数动态申请空间,分别动态申请栈空间以及栈内数组空间大小,初始化结构体中对应值,并对创建进行是否成功进行判定!

2.判断栈空间是否创建成功:方法较多,可自行选择对应的初值进行判定~

3.入栈:优先判断是否有栈溢出,若溢出则进行栈扩展,若不溢出,直接栈顶+1的同时数组进行赋值

4.栈扩展:核心思路在于使用realloc函数扩展栈内数组空间大小~注意!申请的应该是数组指针来扩展大小~同时注意代码中sizeof里面的填写规则,并且附带对应的重复申请机制以及判定是否扩展成功机制

5.提出栈顶元素:直接printf对应数组下标

6.出栈:优先判断是否为空栈后进行数组下标减一

7.释放栈

注意点:按照计算机执行逻辑,得先执行才能识别函数,所以部分功能就会放在前面,同时定义了int型的返回值来对其进行验证操作~其中除了初始化必需要返回结构体指针外,其余功能都可封装验证功能后使用void~

最后使用Main函数进行了主要功能的验证~

~后续出一个栈的内存分析

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//C语言数组实现栈
typedef struct Stack
{
	int* data;//定义栈的指针(可变数组长度)

	int top;//定义栈顶

	int size;//定义栈的大小

}Stack;

//第二个功能:判断栈是否是空栈 || 判断是否创建栈成功
int EmptyStack(Stack* LinkList)
{
	return LinkList->top == -1;
}

//第一个功能:初始栈
Stack* InitStack(int Capacity)//定义结构为指针函数,方便后续返回值应用指针,参数是希望初始栈的大小
{
	Stack* LinkList = (Stack* )malloc(sizeof(Stack));//初始化一个栈空间

	LinkList->data = (int*)malloc(sizeof(int)*(Capacity));//初始化data数组的空间大小

	LinkList->top = -1;//把新创建的结构体——LinkList中的栈顶初始化为-1,栈从0开始算

	LinkList->size = Capacity;//根据输入记录栈数组空间最大值

	int Judge=EmptyStack(LinkList);//创建后判断是否成功创建,利用功能二判断

	if (Judge == 1)
	{
		printf("栈创建成功\r\n");
	 }

	else
	{
		printf("栈创建失败\r\n");
	}

	return LinkList;
}

//第四个功能:栈扩容
int ExpandStack(Stack* LinkList)
{
	int ExpandStack_Size = LinkList->size;//直接在原基础上扩容两倍

	int Flag = 1;//建立一个标记来让While循环停止

	int* ExpandPoint = NULL;//定义一个新指针(注意此时定义的不是Stack类型的指针,是定义一个int型指针来让扩展int型data数组)

	int count = 10;//进行扩容计数,如果超过10次都扩容不成功则返回扩容失败

	while (Flag)
	{

		 ExpandPoint = (int*)realloc(LinkList->data, sizeof(int) * ((LinkList->size) + ExpandStack_Size));

		if (ExpandPoint != NULL)
		{
			Flag = 0;

			printf("栈扩容成功\r\n");

			return 1;
		}

		else//扩容失败后减少扩容
		{
			ExpandStack_Size = ExpandStack_Size / 2;

			count--;
		}

		if (count < 0)
		{
			printf("栈扩容失败\r\n");

			return -1;

			break;
		}
	}

	LinkList->data = ExpandPoint;

	LinkList->size = ((LinkList->size) + ExpandStack_Size);

	
}


//第三个功能:入栈(PUSH)
int PushStack(Stack* LinkList, int i)
{
	if (LinkList->top + 1 == LinkList->size)//栈顶从-1开始,如果栈顶+1等于size那就代表栈溢出了
	{
		ExpandStack(LinkList);//溢出后进行栈扩容,放在功能四

		LinkList->data[(LinkList->top) + 1] = i;

		LinkList->top = LinkList->top + 1;

		return 1;
	}

	else
	{
		LinkList->data[(LinkList->top)+1] = i;

		LinkList->top = LinkList->top + 1;

		return 1;
	}

}


//第五个功能:返回栈顶元素
void StackTop(Stack* LinkList)
{
	printf("%d\r\n",LinkList->data[LinkList->top]);
}

//第六个功能:出栈
int PopStack(Stack* LinkList)
{
	if (LinkList->top == -1)
	{
		return 0;
	}
	
	else
	{
		LinkList->top = LinkList->top - 1;

		return 1;
	}
    
}

//第七个功能;清空栈
int ClearStack(Stack* LinkList)
{
	if (LinkList == NULL)
	{
		return 1;
	}

	free(LinkList->data);

	free(LinkList);

	return 1;
}


main()
{   
	int Capacity = 2;

	Stack* LinkList=InitStack(Capacity);

	PushStack(LinkList, 1);

	PushStack(LinkList, 2);

	StackTop(LinkList);

	PushStack(LinkList, 3);

	StackTop(LinkList);

	PopStack(LinkList);

	StackTop(LinkList);

}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值