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);
}