链栈是指采用链式存储结构实现的栈。
链栈的C语言实现
头文件
#include<stdio.h>
#include<stdlib.h>
//结果函数状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;// Status--函数的类型,其值是函数结果的状态代码
typedef int SElemType;
typedef struct Stack_Node //定义栈节点
{
SElemType data;
struct Stack_Node *next;
}StackNode, *LinkStackNode;
typedef struct LinkStack //定义栈顶指针,方便操作
{
LinkStackNode top; //栈顶指针
int Count; //计数
}LinkStack;
链栈的初始化
void InitLinkStack(LinkStack *S) //链栈的初始化
{
S->Count = 0;
S->top = NULL; //栈顶指针为空
}
判断链栈是否为空
Status IsEmptyLinkStack(LinkStack S) //判断链栈是否为空
{
if(S.Count!=0) return FALSE; //非空返回FALSE--0
else return TRUE; //空返回TRUE---1
}
求链栈长度
int LengthLinkStack(LinkStack S) //求链栈长度
{
return S.Count;
}
清空栈
Status ClearStack(LinkStack *S) //清空栈
{
SElemType e;
while(S->Count!=0) PopLinkStack(S, &e);
if(S->top == NULL) return TRUE;
}
输出显示链栈
void ShowLinkStack(LinkStack S) //输出显示链栈
{
LinkStackNode p = S.top; //令 p 指向栈顶元素
while(p)
{
printf("%d,", p->data);
p = p->next;
}
printf("\n");
}
入栈
Status PushLinkStack(LinkStack *S, SElemType e) //入栈
{
StackNode *p = (LinkStackNode)malloc(sizeof(StackNode)); //生产新节点
p->data = e; //将新节点的数据域置为 e
p->next = S->top; //令 p 指向栈顶元素
S->top = p; //修改栈顶指针
S->Count ++;
return OK;
}
出栈
Status PopLinkStack(LinkStack *S, SElemType *e) //出栈
{
if(S)
{
StackNode *p = S->top;
*e = p->data;
S->top = p->next;
free(p);
S->Count--;
return OK;
}
else return ERROR;
}
主函数
int main()
{
void InitLinkStack(LinkStack *S); //链栈的初始化
Status IsEmptyLinkStack(LinkStack S); //判断链栈是否为空
int LengthLinkStack(LinkStack S); //求链栈长度
void ShowLinkStack(LinkStack S); //输出显示链栈
Status ClearStack(LinkStack *S); //清空栈
Status PushLinkStack(LinkStack *S, SElemType e); //入栈
Status PopLinkStack(LinkStack *S, SElemType *e); //出栈
LinkStack S;
InitLinkStack(&S);
int i;
for(i=0;i<10;i++)
{
PushLinkStack(&S, i);
}
if(IsEmptyLinkStack(S)) printf("空栈\n");
else
{
printf("非空\n");
printf("链栈长度为:%d\n", LengthLinkStack(S));
}
ShowLinkStack(S);
SElemType e;
ClearStack(&S);
printf("链栈长度为:%d\n", LengthLinkStack(S));
}