目录
前序
准备工作
函数声明
函数接口
1.初始化
2.创造节点
3. 判断栈空
4.入栈
5.出栈
6.取栈顶元素
7.销毁栈
8. 获取栈的元素个数
总结
前序
链栈是基于单链表实现的,其实栈更加适合使用顺序表来实现的,这篇文章我们来探讨一下链栈的实现。
准备工作
老规矩,干活前先把符号都定义好了。代码如下;
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
#include<stdlib.h>
typedef int DataType;
typedef struct stack
{DataType data;struct stack* next;
}SL;
typedef struct SLF//用来统计栈元素和插入和删除操作
{SL* top;int count;
}SLF;
结构体节点是包含节点的值,以及指针域,重命名为SL; 下面将栈顶的节点与栈中的元素封装起来:就这么简单;
函数声明
函数接口
列举出栈要实现的函数功能;
1.初始化
//进行初始化
void SLinit(SLF* e)
{assert(e);e->count = 0;;e->top = NULL;
}
2.创造节点
//创造节点
SL* creat(DataType x)
{SL* node = (SL*)malloc(sizeof(SL));if (node == NULL){perror("malloc fail!");exit(1);}node->data = x;node->next = NULL;return node;
}
3. 判断栈空
//判断栈空
bool SLempty(SLF* e)
{return e->count ? false : true;
}
4.入栈
//入栈
void SLpush(SLF* e,DataType x)
{//创造节点SL* cur = creat(x);if (e->count == 0)//如果栈为空,那么把第一个创造的节点当成头结点{e->top = cur;e->count++;}else{cur->next = e->top;//如果栈不为空,新节点指向前一个节点,新节点作为尾节点,但是是栈顶;e->top = cur;//重新指向栈顶元素e->count++;}
}
5.出栈
//删除栈顶元素(出栈)
void SLpop(SLF* e)
{SL* delete = e->top;e->top = e->top->next;free(delete);e->count--;
}
6.取栈顶元素
//取出栈顶元素
DataType SLtop(SLF* e)
{return e->top->data;//直接返回元素
}
7.销毁栈
//销毁栈
void SLdestory(SLF* e)
{while (e->count != 0){SL* pre = e->top;e->top = pre->next;free(pre);e->count--;}return;
}
8. 获取栈的元素个数
//获取栈的元素个数
int SLsize(SLF* e)
{return e->count;
}
总结
链栈的实现大致就是这样,我把源码放在了下面,希望对大家有所帮助;
test_c: 测试仓库 - Gitee.com