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
    

      

  • 相关阅读:
    js01
    js---18miniJquery
    js---17继承中方法属性的重写
    js---16继承
    js---16原型链
    js---15深拷贝浅拷贝 原型链
    js---14公有私有成员方法
    js---13 this call apply
    js---12对象创建方式,构造器,原型
    ESXi导出的CentOS7 ovf文件导入到workstation 无法打开GUI登录界面的问题解决方案
  • 原文地址:https://www.cnblogs.com/veis/p/12912332.html
Copyright © 2011-2022 走看看