摘自《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 |
|
来自: happy123god > 《读书笔记及小结》