zoukankan      html  css  js  c++  java
  • 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]
    ", __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
    

      

  • 相关阅读:
    IDEA开发 Scala 项目
    mvn编译时绕过本地jar去maven仓库下载问题
    三角化(转载)
    分布式文件服务器介绍(转载)
    VSCode 设置侧边栏字体大小
    libLas编译
    OSG编译
    vcpkg.exe安装与应用
    OpenCASCADE编译
    gl2ps编译
  • 原文地址:https://www.cnblogs.com/veis/p/12912332.html
Copyright © 2011-2022 走看看