使用宏实现简单的泛型栈

主要了解了宏的使用,#、##的用法。
#ifndef _STACK_MAC_
#define _STACK_MAC_

#include "../util/log.h"

/* 创建一个指定类型的栈
 *
 * @param  TYPE  栈的数据类型
 * @param  NAME  栈的名字(用于区分)
 * @param  SIZE  栈的最大空间
 * */
#define CreateStack(TYPE, NAME, SIZE)             \
    int NAME##_topElem = -1;                      \
    int NAME##_size    = SIZE;                    \
    TYPE NAME##_array[SIZE];                      \

/* 判断一个栈是否为满状态
 *
 * @param   NAME  要判断的栈的名字
 * @return  flag  是否为满(0/1)
 * */
#define IsFull(NAME) ({NAME##_size == (NAME##_topElem + 1);})  \

/* 判断一个栈是否为空状态
 *
 * @param   NAME  要判断的栈的名字
 * @return  flag  是否为空(0/1)
 * */
#define IsEmpty(NAME) ({NAME##_topElem == -1;})   \

/* 向指定的栈内压入元素
 *
 * @param  NAME  要压入元素栈的名字
 * @prarm  ELEM  要压入的元素
 * */
#define PushStack(NAME, ELEM)                     \
    do {                                          \
        if(IsFull(NAME)) {                        \
            LOG("栈 %s 已满!\n", #NAME)            \
            break;                                \
        }                                         \
        NAME##_topElem++;                         \
        NAME##_array[NAME##_topElem] = ELEM;      \
    }while(0);                                    \

/* 对指定的栈进行出栈
 *
 * @param  NAME  要出栈的栈的名字
 * @prarm  e     将栈顶元素保存至e
 * */
#define PopStack(NAME, e)                         \
    do {                                          \
        if(IsEmpty(NAME)) {                       \
            LOG("栈 %s 已空!\n", #NAME)            \
            break;                                \
        }                                         \
        *e = NAME##_array[NAME##_topElem];        \
        NAME##_topElem--;                         \
    }while(0);                                    \



#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值