#include #include #define stack_define( TYPE ) \ typedef struct _##TYPE##_stack_t { \ TYPE *array; \ int array_size; \ int array_capacity; \ } TYPE##_stack_t #define stack_declare( TYPE ) \ TYPE##_stack_t #define init( TYPE, initial_size ) \ { \ malloc( ( (initial_size >= 1) ? initial_size : 1 )*sizeof( TYPE ) ), \ 0, \ ( (initial_size >= 1) ? initial_size : 1 ) \ } #define free_stack( stack ) \ free( stack.array ) #define pop( stack ) \ if ( stack.array_size > 0 ) { \ --stack.array_size; \ } #define push( TYPE, stack, element ) \ if ( stack.array_size < stack.array_capacity ) { \ stack.array[stack.array_size] = element; \ ++stack.array_size; \ } else { \ int i; \ TYPE *tmp_array = stack.array; \ \ stack.array = malloc( 2*(stack.array_capacity)*sizeof( TYPE ) ); \ \ for ( i = 0; i < stack.array_capacity; ++i ) { \ stack.array[i] = tmp_array[i]; \ } \ \ stack.array_capacity *= 2; \ free( tmp_array ); \ \ stack.array[stack.array_size] = element; \ ++stack.array_size; \ } #define top( stack ) \ ( ( stack.array_size == 0 ) ? 0 : stack.array[stack.array_size - 1] ) stack_define( int ); int main(void) { stack_declare( int ) s = init( int, 10 ); printf( "Pushing 3, 5, 7, and 9...\n" ); push( int, s, 3 ); push( int, s, 5 ); push( int, s, 7 ); push( int, s, 9 ); printf( "Front: %d\n", top( s ) ); printf( "Popping twice...\n" ); pop( s ); pop( s ); printf( "Front: %d\n", top( s ) ); printf( "Popping once...\n" ); pop( s ); printf( "Front: %d\n", top( s ) ); free_stack( s ); return 0; }