• 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
    

      

  • 相关阅读:
    提供思路的一些视角,两种方法。
    试错?捷径?
    AntV G2 toolTip 自定义显示 One'_
    Vue 鼠标滚轮控制左右滑动 One'_
    Ant Design of Vue table表格 点击一行选中效果 One'_
    记录百度地图marker中label现隐 One'_
    inputplaceholder css样式 One'_
    VUE + Springboot + SM4前端加密 后端解密 One'_
    复选框样式复写 One'_
    echarts 3D地图 One'_
  • 原文地址:https://www.cnblogs.com/veis/p/12912332.html
Copyright © 2020-2023  润新知