目录
上节介绍了顺序栈,本节开始讲解链栈!
所谓链栈就是以链表的形式来实现栈的这种结构。
在链表里面我们有个“头指针”的概念,而在栈里面我们有“栈顶指针”的概念。
Top既可以是头指针,也可以是栈顶指针。
每进栈一个元素,top就往上移动一次,每出栈一个元素,top就往下移动一次。所以我们将指针的方向定义为从上往下指,这样可以省去“头指针”和“栈顶指针”这些概念。
那如何来用结构体来表示链栈?同时,每个节点也都需要一个结构体,里面有指针域和数据域。
因此我们需要定义两个结构体
创建一个linkstack的文件夹
定义链栈
我们需要在stack.h中定义两个结构体
链栈的初始化
我们初始化链表的时候是初始化一个头结点,但是链栈我们就没必要头结点。
所以初始化一个空栈的话,直接让top指针等于空就行了
Stack.c
因为我们不用头结点,所以初始化的时候并不需要申请空间
在stack.h里面声明一下这个函数
Main.c
运行结果:
进栈操作
进栈不存在栈满的情况,因为它是链式结构,因此不用判断
Stack.c
在stack.h里面声明一下这个函数
Main.c
运行结果
出栈操作
将栈顶的元素所在的空间释放掉,但是在释放之前需要把改节点的数据记录下来
Stack.c
在stack.h里面声明一下这个函数
Main.c
运行结果
栈的清空操作和链表的清空操作一模一样,挨个释放,直到top等于空,代码省略。
栈不存在销毁操作,因为我们初始化栈的时候根本不需要申请空间。
完整代码
Stack.c
#include "stack.h"
#include <stdlib.h>
//初始化栈
int InitStack(LinkStack *s)
{
if(NULL==s)
return FAILURE;
s->top=NULL;
s->length=0;
return SUCCESS;
}
//进栈操作
int PushStack(LinkStack *s,int num)
{
if(NULL==s)
return FAILURE;
//进栈要给节点申请空间
Node *m=(Node*)malloc(sizeof(Node)*1);
if(NULL==m)
return FAILURE;//申请失败
//往节点的指针域和数据域填写东西
m->data=num;
m->next=s->top;//此时这个节点是栈顶,所以它指向的是top指向的位置
//更新top的值
s->top=m;//指向这个节点
//长度加1
s->length++;
return SUCCESS;
}
//出栈操作
int PopStack(LinkStack *s)
{
if(NULL==s)
return FAILURE;
//将要释放的节点的值记录下来,等会儿要返回
int num=s->top->data;//栈顶指针s->top指向一个节点,这个节点里面有个数据data,其实s->top就是一个地址,通过地址访问该地址里面的成员data
//将要释放的节点的地址也记录下来,等会儿要释放掉这个空间
Node *n=s->top;
//s->top向下移动
s->top=n->next;
free(n);//释放掉记录下来的地址
return num;
}
stack.h
#ifndef _STACK_H
#define _STACK_H
#define SUCCESS 1000
#define FAILURE 1001
//表示节点的结构体
typedef struct Node
{
int data;//数据域
struct Node *next;//指针域
}Node;
//表示栈的结构体
typedef struct Stack
{
Node *top;//表示栈顶指针
int length;//表示栈的长度
}LinkStack;
int InitStack(LinkStack *s);
int PushStack(LinkStack *s,int num);
int PopStack(LinkStack *s);
#endif
Main.c
#include <stdio.h>
#include "stack.h"
int main()
{
//创建栈
LinkStack Stack;
//初始化链栈
int ret=InitStack(&Stack);
if(SUCCESS==ret)
{
printf("初始化栈成功\n");
}
else
{
printf("初始化栈失败\n");
}
//进栈操作
ret=PushStack(&Stack,10);//进栈10
if(SUCCESS==ret)
{
printf("进栈成功\n");
}
else
{
printf("进栈失败\n");
}
//出栈操作
ret=PopStack(&Stack);
if(FAILURE==ret)
{
printf("出栈失败\n");
}
else
{
printf("%d 出栈成功\n",ret);
}
return 0;
}
下节使用栈结构来解决一道四则运算的问题!
QQ交流群:963138186
本篇就到这里,下篇继续!欢迎点击下方订阅本专栏↓↓↓