欢迎来到我的博客https://www.cnblogs.com/veis/

https://www.cnblogs.com/veis/p/14182037.html

C语言封装的栈结构

1.源代码

#include "stack.h"

/**
 * [CreateStack 创建一个栈结构]
 * @param p     [要创建的栈类型指针]
 * @param nSize [栈大小]
 */
p_stack CreateStack(int nSize)
{
	p_stack ps = malloc(sizeof(struct SStack));
    ps->m_pData = malloc(sizeof(DATA) * nSize);
    ps->m_nCount = nSize;
    ps->m_nTop = -1;
	return ps;
}

/**
 * [DeleteStack 删除一个栈结构]
 * @param p [已经创建好的栈指针]
 */
void DeleteStack(p_stack p)
{
	ASSERT_ERROR(p != NULL);
	p->m_nTop = -1;
	p->m_nCount = 0;
	free(p->m_pData);
    free(p);
}

/**
 * [IsFull 判断是否满栈]
 * @param  p [栈指针]
 * @return   [满则返回1,否则返回0]
 */
int IsFull(p_stack p)
{
	ASSERT_ERROR(p != NULL);
	return p->m_nCount == (p->m_nTop + 1);
}

/**
 * [IsEmpty 判断栈是否为空]
 * @param  p [栈指针]
 * @return   [空则返回1,非空则返回0]
 */
int IsEmpty(p_stack p)
{
	ASSERT_ERROR(p != NULL);
	return p->m_nTop == -1;
}

/**
 * [Push 压入一个元素]
 * @param  p     [栈指针]
 * @param  pdata [需要压入的数据的地址,使用指针便于传递结构体类型数据]
 * @return       [成功压入返回TRUE,否则返回FALSE]
 */
int Push(p_stack p, const DATA *pdata)
{
    ASSERT_ERROR(p != NULL);
	if(IsFull(p))
		return FALSE;
	p->m_pData[++(p->m_nTop)] = *pdata;
	return TRUE;
}

/**
 * [PushByValue 压入一个元素]
 * @param  p    [栈指针]
 * @param  data [需要压入的数据]
 * @return      [成功压入返回TRUE,否则返回FALSE]
 */
int PushByValue(p_stack p, const DATA data)
{
    ASSERT_ERROR(p != NULL);
	if (IsFull(p))
		return FALSE;
	p->m_pData[++(p->m_nTop)] = data;
	return TRUE;
}

/**
 * [Pop 弹出一个元素]
 * @param  p     [栈指针]
 * @param  pdata [接收需要弹出的数据,如果不需要接收可以传入NULL]
 * @return       [成功弹出返回TRUE,否则返回FALSE]
 */
int Pop(p_stack p, DATA *pdata)
{
    ASSERT_ERROR(p != NULL);
	if(IsEmpty(p))
		return FALSE;
	if(pdata != NULL)
		*pdata = p->m_pData[p->m_nTop];
	--(p->m_nTop);
	return TRUE;
}

/**
 * [GetSize 获取栈中元素个数]
 * @param  p [栈指针]
 * @return   [栈元素个数]
 */
int GetSize(p_stack p)
{
    ASSERT_ERROR(p != NULL);
	return (p->m_nTop + 1);
}

  

2.头文件

#ifndef __STACK_H__
#define __STACK_H__

#include <stdio.h>
#include <stdlib.h> 

#define DEBUG_ASSERT

#ifndef NULL
#define NULL (void *)0
#endif 

#ifndef FALSE
#define FALSE 0
#endif

#ifndef TRUE
#define TRUE 1
#endif

// 定义校验宏
#ifdef DEBUG_ASSERT
#define ASSERT_ERROR(x) do{if(!x){printf("[ERROR]:file[%s] line[%d] function[%s]\r\n", __FILE__, __LINE__, __func__);while(1);}}while(0)
#else
#define ASSERT_ERROR(x)
#endif


// 作为栈中核心数据成员
// 需要根据实际情况定义DATA
typedef int DATA;

typedef struct SStack // 栈结构
{
	DATA *m_pData;
	int m_nTop;
	int m_nCount;
} stack, *p_stack;

p_stack CreateStack(int nSize); // 创建一个栈
void DeleteStack(p_stack p); // 删除栈
int IsFull(p_stack p); // 满栈判断
int IsEmpty(p_stack p); // 空栈判断
int Push(p_stack p, const DATA *pdata); // 入栈
int PushByValue(p_stack p, const DATA data); // 入栈
int Pop(p_stack p, DATA *pdata); // 出栈
int GetSize(p_stack p); // 获取栈元素个数

#endif

  

posted @ 2020-05-18 18:37  veis  阅读(333)  评论(0编辑  收藏  举报