链式栈的9种基本操作
定义常量
#include <stdio.h>
#include <malloc.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE 0
typedef int Status;
结构体定义和函数声明
typedef int SElemType;
typedef struct SNode
{
SElemType data;
struct SNode* next;
}SNode, * StackPtr;
typedef struct
{
StackPtr base;
StackPtr top;
}LinkStack;
Status InitStack(LinkStack* S);
Status DestroyStack(LinkStack* S);
Status ClearStack(LinkStack* S);
Status StackEmpty(LinkStack S);
int StackLength(LinkStack S);
Status GetTop(LinkStack S, SElemType* e);
Status Push(LinkStack* S, SElemType e);
Status Pop(LinkStack* S, SElemType* e);
Status StackTraverse(LinkStack S, Status(*visit)(SElemType*));
Status visit(SElemType* e);
函数定义
Status InitStack(LinkStack* S)
{
S->top = (StackPtr)malloc(sizeof(SNode));
if (!S->top) exit(-1);
S->base = S->top;
S->base->next = NULL;
return OK;
}
Status DestroyStack(LinkStack* S)
{
while (S->top)
{
S->base = S->top->next;
free(S->top);
S->top = S->base;
}
return OK;
}
Status ClearStack(LinkStack* S)
{
StackPtr p, q;
p = S->top;
S->top = S->base;
while (p != S->base)
{
q = p->next;
free(p);
p = q;
}
return OK;
}
Status StackEmpty(LinkStack S)
{
if (S.top == S.base)
return TRUE;
else
return FALSE;
}
int StackLength(LinkStack S)
{
int len = 0;
StackPtr p = S.top;
while (p != S.base)
{
len++;
p = p->next;
}
return len;
}
Status GetTop(LinkStack S, SElemType* e)
{
if (S.base == S.top)
return ERROR;
*e = S.top->data;
return OK;
}
Status Push(LinkStack* S, SElemType e)
{
StackPtr temp = (StackPtr)malloc(sizeof(SNode));
if (!temp) exit(-1);
temp->data = e;
temp->next = S->top;
S->top = temp;
return OK;
}
Status Pop(LinkStack* S, SElemType* e)
{
if (S->top == S->base)
return ERROR;
StackPtr temp = S->top;
*e = temp->data;
S->top = S->top->next;
free(temp);
return OK;
}
Status StackTraverse(LinkStack S, Status(*visit)(SElemType*))
{
StackPtr p = S.top;
while (p != S.base)
{
visit(&p->data);
p = p->next;
}
printf("\n");
return OK;
}
测试
int main()
{
LinkStack S;
InitStack(&S);
if (StackEmpty(S))
printf("空栈!\n");
else
printf("不是空栈!\n");
printf("栈长为:%d\n", StackLength(S));
SElemType i;
for (i = 1; i <= 8; i++)
{
if (Push(&S, i))
printf("入栈成功!\n");
else
printf("入栈失败!\n");
}
printf("栈长为:%d\n", StackLength(S));
SElemType e;
if (GetTop(S, &e))
printf("栈顶元素:%d\n", e);
else
printf("获取失败!\n");
StackTraverse(S, visit);
if (Pop(&S, &e))
printf("出栈成功:%d\n", e);
else
printf("出栈失败!\n");
if (Pop(&S, &e))
printf("出栈成功:%d\n", e);
else
printf("出栈失败!\n");
printf("栈长为:%d\n", StackLength(S));
if (GetTop(S, &e))
printf("栈顶元素:%d\n", e);
else
printf("获取失败!\n");
StackTraverse(S, visit);
if (ClearStack(&S))
printf("清空成功!\n");
else
printf("清空失败!\n");
printf("栈长为:%d\n", StackLength(S));
if (GetTop(S, &e))
printf("栈顶元素:%d\n", e);
else
printf("获取失败!\n");
if (DestroyStack(&S))
printf("销毁成功!\n");
else
printf("销毁失败!\n");
return 0;
}
Status visit(SElemType* e)
{
printf("%d ", *e);
return OK;
}
运行结果