# 数据结构之链式栈的一些基本操作

#ifndef __LINKSTACK_H__
#include "error.h"

#define FALSE 0
#define TRUE  1

typedef int StackData;
typedef struct _node
{
StackData data;
struct _node* next;
}Node;
{
Node* top;

// 创建栈

// 判栈空否

// 进栈
int Push (LinkStack* s, StackData x);

// 出栈
int Pop (LinkStack* s, StackData *x);

// 获取栈顶元素
int GetTop (LinkStack* s, StackData *x);

// 销毁表

#endif      // __LINKSTACK_H__

#include "LinkStack.h"
#include <stdlib.h>

// 创建栈
{
if (NULL == s)
{
errno = MALLOC_ERROR;
return NULL;
}

// 置空栈
s->top = NULL;
return s;
}

// 判栈空否
{
if (NULL == s)
{
errno = ERROR;
return FALSE;
}
return s->top == NULL;
}

// 进栈
int Push (LinkStack* s, StackData x)
{
if (NULL == s)
{
errno = ERROR;
return FALSE;
}

// 新建结点
Node* node = (Node*) malloc(sizeof(Node)/sizeof(char));
if (NULL == node)
{
errno = MALLOC_ERROR;
return FALSE;
}

node->data = x;
node->next = s->top;
s->top = node;

return TRUE;
}

// 出栈
int Pop (LinkStack* s, StackData *x)
{
if (NULL == s)
{
errno = ERROR;
return FALSE;
}

if (StackEmpty(s))
{
errno = EMPTY_STACK;
return FALSE;
}

Node* p = s->top;
*x = p->data;
s->top = p->next;
free(p);

return TRUE;
}

// 获取栈顶元素
int GetTop (LinkStack* s, StackData* x)
{
if (NULL == s)
{
errno = ERROR;
return FALSE;
}

if (StackEmpty(s))
{
errno = EMPTY_STACK;
return FALSE;
}

*x = s->top->data;
return TRUE;
}

// 销毁栈
{
if (NULL == s)
{
errno = ERROR;
return FALSE;
}

int x;
while (TRUE != StackEmpty(s))
{
Pop (s, &x);
}

free(s);
return TRUE;
}