【C/C++】【数据结构】链式栈操作

目录

链式栈操作

头文件定义

链式栈初始化

链式栈判空

链式栈入栈操作

链式栈获取栈顶数据

链式栈出栈操作

链式栈重置

链式栈销毁


链式栈操作

头文件定义

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_42379345/article/details/81504854