链栈:就是一种特殊的单链表,FILO(先进后出)
通常对于链表来说:
1.是不需要头节点的。
2.基本不存在满栈的情况,除非内存已没有可用的空间。
不多bibi你们都懂哈,直接上代码:
链栈结构:
typedef struct StockNode{
// 数据域
Element data;
// 下个节点的指针域
struct StockNode *next;
}StockNode,*LinkStackPtr;
typedef struct LinkStack{
// 栈的大小
int count;
// 记录栈顶元素
LinkStackPtr top;
}LinkStack;
链栈的操作:
// 当前栈是否为空栈
bool StatckEmpty(LinkStack *ls){
if(ls->count > 0){
return false;
}
return true;
}
// 入栈操作
Status Push(LinkStack *ls,Element v){
LinkStackPtr e = (LinkStackPtr)malloc(sizeof(StockNode));
e->data = v;
// 把当前的栈顶元素值赋值给新节点的直接后继
e->next = ls->top;
// 将新节点赋值给栈顶指针
ls->top = e;
ls->count++;
return OK;
}
// 弹栈
Status Pop(LinkStack *ls,Element *v){
if(StatckEmpty(ls)){
return ERROR;
}
*v = ls->top->data;
// 用来记录要出栈的元素节点
LinkStackPtr temp;
temp = ls->top;
// 使栈顶指针下移一位,指向后面的节点
ls->top = ls->top->next;
// 释放要出栈元素所在空间
free(temp);
// 将栈的大小更新
ls->count--;
return OK;
}
// 获取栈顶元素
void GetTop(LinkStack *ls,Element *v){
if(!StatckEmpty(ls)){
*v = ls->top->data;
}
}
// 获取栈的元素个数
int StatckLength(LinkStack *ls){
if(!StatckEmpty(ls)){
return ls->count;
}
return -1;
}
// 初始化栈
LinkStack* InitStack(){
LinkStack *ls;
ls = (LinkStack *)malloc(sizeof(LinkStack));
ls->top = NULL;
ls->count = 0;
}
// 创建一个链栈
void CreateLinkStack(LinkStack *ls,int size){
LinkStackPtr e;
for(int i=1;i < size;i++){
Push(ls,i);
}
}
// 打印栈:
void LinkStackPrint(LinkStack *ls){
LinkStackPtr p = ls->top;
printf("[");
while (p)
{
printf("%d", p->data);
p = p->next;
if(p){
printf(", ");
}
}
printf("]\n");
}
// 清空栈
Status ClearStack(LinkStack *ls){
// 用来记录要出栈的元素节点
LinkStackPtr temp;
while(!stackEmpty(ls)){
temp = ls->top;
// 使栈顶指针下移一位,指向后面的节点
ls->top = ls->top->next;
// 释放要出栈元素所在空间
free(temp);
// 将栈的大小更新
ls->count--;
}
return OK;
}
// 销毁栈
Status DestoryStack(LinkStack *ls){
ClearStack(ls);
free(ls);
return OK;
}
测试代码:
void LinkStackTest(){
LinkStack *ls = InitStack();
printf("栈被初始化了\n");
CreateLinkStack(ls,5);
printf("%d个元素已入栈",5-1);
LinkStackPrint(ls);
printf("一个元素入栈:");
Push(ls,5);
LinkStackPrint(ls);
Element pv;
Element *resP;
resP = &pv;
Pop(ls,resP);
printf("当前出栈元素:%d\n",*resP);
int length = StatckLength(ls);
printf("当前链栈的长度:%d\n",length);
GetTop(ls,resP);
printf("当前栈顶元素:%d\n",*resP);
ClearStack(ls);
//DestoryStack(ls);销毁后这个栈将不存在,而不是个空栈
printf("清空整个栈后:");
LinkStackPrint(ls);
}
运行结果