目录
链式栈操作
头文件定义
#ifndef _LINKSTACK_H_
#define _LINKSTACK_H_
#include<stdlib.h>
#define SUCCESS 10000
#define FAILURE 10001
#define TRUE 10002
#define FALSE 10003
#define STACKSIZE 10
typedef int ElemType;
//节点的信息
struct stacknode
{
ElemType data; //数据域
struct stacknode *pNextNode; //指针域
};
typedef struct stacknode StackNode;
//栈的信息
struct stack
{
StackNode *pStackTop; //栈顶指针
int count; //节点个数
};
typedef struct stack LinkStack;
int StackInit( LinkStack **ppStack); //栈初始化
int StackEmpty( LinkStack *pStack); //栈判空
int push( LinkStack **ppStack, ElemType e); //入栈
int GetTop( LinkStack *pStack); //获取栈顶数据
int pop( LinkStack **pStack); //出栈
int StackClear( LinkStack **ppStack); //栈重置
int StackDestroy( LinkStack **ppStack); //栈销毁
#endif
链式栈初始化
操作结果:构造一个空栈Stack
//栈初始化
int StackInit( LinkStack **ppStack)
{
if( NULL == ppStack) //入参判断
{
return FAILURE;
}
(*ppStack) = (LinkStack *) malloc(sizeof(LinkStack)); //给*ppStack分配空间
if( NULL == (*ppStack) )
{
return FAILURE;
}
(*ppStack)->pStackTop = NULL; //初始化操作
(*ppStack)->count = 0;
return SUCCESS;
}
链式栈判空
前提条件:栈Stack已存在
操作结果:若栈Stack是空栈返回TRUE,否则返回FALSE。
//栈判空
int StackEmpty( LinkStack *pStack)
{
if( NULL == pStack) //入参判断
{
return FAILURE;
}
return pStack->pStackTop == NULL ? TRUE : FALSE;
}
链式栈入栈操作
前提条件:栈Stack存在
操作结果:插入元素e为新的栈顶元素
//入栈
int push( LinkStack **ppStack, ElemType e)
{
if( NULL == ppStack || NULL == *ppStack) //入参判断
{
return FAILURE;
}
StackNode *pNewNode = NULL;
pNewNode = (StackNode *)malloc(sizeof(StackNode) * 1);
if( pNewNode == NULL)
{
return FAILURE;
}
pNewNode->data = e; //传值
pNewNode->pNextNode = (*ppStack)->pStackTop; //进栈操作
(*ppStack)->pStackTop = pNewNode;
(*ppStack)->count++;
return SUCCESS;
}
链式栈获取栈顶数据
前提条件:栈Stack存在
操作结果:返回栈Stack栈顶的数据
//获取栈顶元素
int GetTop( LinkStack *pStack)
{
if( NULL == pStack || NULL == pStack->pStackTop) //入参判断
{
return FAILURE;
}
return pStack->pStackTop->data;
}
链式栈出栈操作
前提条件:栈Stack存在,且非空
操作结果:删除栈顶元素
//出栈
int pop( LinkStack **ppStack)
{
if( NULL == ppStack || NULL == (*ppStack)->pStackTop) //入参判断
{
return FAILURE;
}
StackNode *pTempNode = NULL;
ElemType e = (*ppStack)->pStackTop->data; //记录被出栈的数据
pTempNode = (*ppStack)->pStackTop; //记录被出栈的节点
(*ppStack)->pStackTop = pTempNode->pNextNode; //出栈操作
(*ppStack)->count--;
free(pTempNode); //释放出栈的节点
pTempNode = NULL;
return e;
}
链式栈重置
前提条件:栈Stack存在
操作结果:栈内节点清空,栈Stack重置
//栈重置
int StackClear( LinkStack **ppStack)
{
if( NULL == ppStack) //入参判断
{
return FAILURE;
}
StackNode *pTempNode = NULL;
while( (*ppStack)->pStackTop != NULL)
{
pTempNode = (*ppStack)->pStackTop; //记录要被清除的结点
(*ppStack)->pStackTop = pTempNode->pNextNode; //脱离节点
(*ppStack)->count--;
free(pTempNode); //释放脱离的节点
pTempNode = NULL;
}
if( (*ppStack)->pStackTop == NULL && 0 == (*ppStack)->count)
//如果top指向NULL,且count值为0,则栈已重置
{
return SUCCESS;
}
return FAILURE;
}
链式栈销毁
前提条件:栈Stack存在
操作结果:栈Stack被销毁
//栈销毁
int StackDestory( LinkStack **ppStack)
{
if( NULL == ppStack || NULL == (*ppStack)) //入参判断
{
return FAILURE;
}
StackNode *pTempNode = NULL;
while( (*ppStack)->pStackTop != NULL)
{
pTempNode = (*ppStack)->pStackTop; //记录要被销毁的结点
(*ppStack)->pStackTop = pTempNode->pNextNode; //脱离节点
(*ppStack)->count--;
free(pTempNode); //释放脱离的节点
pTempNode = NULL;
}
if( (*ppStack)->pStackTop == NULL) //如果栈内节点全被销毁,就开始销毁栈
{
free(*ppStack);
(*ppStack) = NULL;
return SUCCESS;
}
return FAILURE;
}