最近学习数据结构中对其中的栈有所总结
首先要清楚栈是一种链式的数据结构,栈的原则是先进后出,额。。。用一个形象的比喻来形容便是穿裤子和脱裤子这个行为,所以我们将穿裤子这个动作叫做压栈,将脱裤子这个行为叫做出栈,将没穿裤子叫做空栈。
先看下面这一段定义
#define Max 100
struct stack
{
int* top;
int* base;
int max_size;//当前个数
};
typedef struct stack stack;
记住上面这个图,我们以上都围绕着这个图来讲述,
base指针当作栈底和用来申请内存,可以用malloc函数申请Max大小个,重所周知malloc函数申请的内存是连续的便可以和当成数组去使用,所以我们便可以用top也一起指向这个内存,当这个top与base指向同一个地方时便是空栈,每放进去一个元素top便自增,可以让top指针一直指向最后一个元素的下一个地址,所以我们现在就可以初始化这个栈
stack* creatStack()
{
stack* stack = (struct stack*)malloc(sizeof(struct stack));
stack->base = (int *)malloc(sizeof(int)*Max);//一次申请Max个int数据类型大小的内存
assert(stack->base);
stack->top = stack->base;
stack->max_size = 0;
return stack;
}
入栈要注意栈是否满了,所以便可以使用这个max_size这个值去判断
将每一个要放入的元素的值赋值给top所指向的内存。(切记是先赋值top再++)
void pushStack(stack* stack, int x)
{
if (stack->max_size>Max)//stack->max_size>Max时数据满了,退出这个函数
return;
*(stack->top)= x;//将每一个要放入的元素的值赋值给top所指向的内存
stack->top++;
stack->max_size++;
}
出栈注意先出栈top再--
void popStack(stack* stack)
{
int x = 0;
printf("出栈后的元素");
while (stack->max_size != 0)
{
stack->top--;
x = *(stack->top);
stack->max_size--;
printf("%d ",x );
}
}
综上所述,再加上主函数便可以构成这个栈啦
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define Max 100
struct stack
{
int* top;
int* base;
int max_size;//当前个数
};
typedef struct stack stack;
stack* creatStack()
{
stack* stack = (struct stack*)malloc(sizeof(struct stack));
stack->base = (int *)malloc(sizeof(int)*Max);
assert(stack->base);
stack->top = stack->base;
stack->max_size = 0;
return stack;
}
void pushStack(stack* stack, int x)
{
if (stack->max_size>Max)
return;
*(stack->top)= x;
stack->top++;
stack->max_size++;
}
void popStack(stack* stack)
{
int x = 0;
printf("出栈后的元素");
while (stack->max_size != 0)
{
stack->top--;
x = *(stack->top);
stack->max_size--;
printf("%d ",x );
}
}
int main(void)
{
int a=0;
stack* stack = creatStack();
for (int i = 0;i <10;i++)
{
pushStack(stack, i);
}
popStack(stack);
return 0;
}