C语言泛型实现抽象数据类型(ADT:abstract data type)之泛型堆栈

泛型:泛型是编写一组函数,但是数据的类型暂时可以不确定的能力。这组函数随后用用户需要的不同类型进行实例化或创建。

C语言并没有提供这种能力,泛型思想被提出的时间的比C语言的设计晚很多,但是我们可以用define模拟这种机制。

 

下面是一个用静态数组实现的泛型堆栈,数组的长度当堆栈实例化时作为参数提出

#include <assert.h>
//定义一个宏,其中SUFFIX是不同类型时函数的后缀

#define GENERIC_STACK( STACK_TYPE, SUFFIX, STACK_SIZE )    \
        
        static    STACK_TYPE    stack##SUFFIX[STACK_SIZE]  \
        static    int           top_element##SUFFIX = -1   \

        int is_empty##SUFFIX( void )                       \
        {                                                  \
            return top_element##SUFFIX == -1;              \
        }                                                  \
        
        int is_full##SUFFIX( void )                        \
        {                                                  \
            return top_element##SUFFIX == STACK_SIZE-1;    \
        }                                                  \
        
        void push##SUFFIX( STACK_TYPE value)               \
        {                                                  \
            assert( !is_full##SUFFIX() );                  \
            top_element##SUFFIX += 1;                      \
            stack##SUFFIX[ top_element##SUFFIX ] =value;   \
        }                                                  \
           
        void pop##SUFFIX( void )                           \
        {                                                  \
            assert( !is_empty##SUFFIX() );                 \
            top_element##SUFFIX -=1;                       \
        }                                                  \

        STACK_TYPE top##SUFFIX( void )                     \
        {                                                  \
            assert( !is_empty##SUFFIX() );                 \
            return stack##SUFFIX[element##SUFFIX];         \
        }                                                  \

通过这个宏来使用泛型的堆栈

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

//创建两个堆栈,一个装整数,一个装浮点数

GENERIC_STACK( int, _int ,10 )
GENERIC_STACK( float , _float , 10)

int main()
{
    push_int(3);
    push_float(3.5);
    top_int();
    top_float();
    pop_int();
    pop_flota();
    
    return EXIT_SUCCESS;
}

C语言实现泛型很困难,主要还是用define定义宏来实现的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值