分享

(原创)C语言泛型

 happy123god 2012-04-10
摘自《pointers on C 》

#if 1

/*
   通用性:
   1.采用一种命名约定,避免不同类型间堆栈的名字冲突。
   2.必须保证为每种不同类型的堆栈只创建一组堆栈数据。
   3.在访问堆栈时,必须保证使用适当的名字(如push_int,push_float)。
   4.确保向函数传递正确的堆栈数据结构。
    
  使用泛型数组建立的通用堆栈。 另外一种方法是
  传递void *类型的指针,其指向需要压栈的数据,
  同时,传递另一个参数,表示数据的类型, 
*/

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#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[ top_element##SUFFIX ]; \
       }                                         \
       

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

int main()
{
    push_int( 5 );
    push_int( 22 );
    push_int( 15 );
    
    push_float( 25.3 );
    push_float( -40.5 );
    
    while( !is_empty_int() ) 
    {
        printf(" popping %d \n",top_int() );
        pop_int();
            
    }
    
    while( !is_empty_float() ) 
    {
        printf(" popping %f \n",top_float() );
        pop_float();
            
    }
    
    
    system("PAUSE");
    return 0;    
}


#endif

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多