目录
[3.1 创建链式栈](#3.1 创建链式栈)
[3.2 压栈](#3.2 压栈)
[3.3 弹栈](#3.3 弹栈)
[3.4 释放链式栈](#3.4 释放链式栈)
一、节点结构、头结构
C
//节点结构
typedef struct _node
{
Element data;
struct _node *next;
}StackNode;
//头结构
typedef struct
{
StackNode *top;
int count;
}LinkStack;
这里头结构为什么要封装成结构体形式?
你想想,如过不封装成结构体,实现新元素插入将会如下:
void insertE(node *top,Element val){
node *new_node = malloc();
new_node->next = top;
top = new_node; // 函数是值传递无法完成更新
}
而如果将*top封装进结构体如上,实现就会通过结构体间接访问,完成值的修改
二、链式栈主要接口
C
LinkStack *createLinkStack();
void releaseLinkStack(LinkStack *stack);
int pushLinkStack(LinkStack *stack,Element e);
int popLinkStack(LinkStack *stack,Element *e);
分别是创建链式栈、释放链式栈、压栈、弹栈几个接口
三、链式栈具体接口实现
3.1 创建链式栈
C
LinkStack* createLinkStack()
{
LinkStack *link_stack = malloc(sizeof(LinkStack));
if (link_stack == NULL)
{
fprintf(stderr,"LinkStack malloc failed\n");
return NULL;
}
link_stack->top = NULL;
link_stack->count = 0;
return link_stack;
}
栈顶初始指向空,不存在任何节点
3.2 压栈
C
int pushLinkStack(LinkStack* stack, Element e)
{
StackNode* node = malloc(sizeof(StackNode));
if (node == NULL)
{
fprintf(stderr, "Node malloc failed\n");
return -1;
}
node->data = e;
node->next = stack->top;
stack->top = node;
++stack->count;
return 0;
}
这里的node->next = stack->top
stack->top = node;
意思是将新插入的节点的next指针,指向栈顶
将栈顶更新为新插入的节点,如下图:

3.3 弹栈
C
int popLinkStack(LinkStack* stack, Element *e)
{
if (stack->top == NULL)
{
printf(stderr,"stack empty\n");
return -1;
}
*e = stack->top->data;
StackNode *tmp = stack->top;
stack->top = tmp->next;
free(tmp);
--stack->count;
return 0;
}
1、这块意思是*e存现在栈顶元素,通过指针参数返回值
为什么不是直接return?空栈时无法返回有效值
2、tmp指向栈顶,将栈顶更新为原栈顶的后一个元素
将原来的栈顶释放

3.4 释放链式栈
C
void releaseLinkStack(LinkStack* stack)
{
if (stack)
{
while (stack->top)
{
StackNode *tmp = stack->top;
stack->top = tmp->next;
free(tmp);
--stack->count;
}
printf("stack count : %d\n",stack->count);
}
}
是站在栈顶不断删元素:
不断更新stack->top、不断free(tmp)旧节点

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!
