/* ppps_int_stack.c [サンプルライブラリ] int型のスタック author: K.Y (Programming Place Plus) version 1.0.2 '2019/9/20 ・Webサイト側が C99規格へ対応したことに合わせて、コードを修正。 コメントスタイルと、変数宣言位置を変えた。 bool型を使う。 1.0.1 '2013/1/26 ・ppps_int_stack_try_pop関数を追加。 ・外部へ公開しない関数に static を付加。 1.0.0 '2012/7/7 */ #include #include #include #include "ppps_int_stack.h" static void* xmalloc(size_t size); struct PPPSIntStack_tag { int* data; // 要素を格納する動的配列 size_t size; // data の要素数 size_t top; // 最上段の添字 }; /* スタックを作る */ PPPSIntStack ppps_int_stack_create(size_t size) { assert( size > 0 ); struct PPPSIntStack_tag* stack = xmalloc( sizeof(struct PPPSIntStack_tag) ); stack->data = xmalloc( sizeof(int) * size ); stack->size = size; stack->top = 0; return stack; } /* スタックを削除する */ void ppps_int_stack_delete(PPPSIntStack stack) { free( stack->data ); free( stack ); } /* スタックに要素を積む */ void ppps_int_stack_push(PPPSIntStack stack, int value) { assert( stack->top < stack->size ); stack->data[stack->top] = value; stack->top += 1; } /* スタックから要素を降ろす */ int ppps_int_stack_pop(PPPSIntStack stack) { assert( !ppps_int_stack_is_empty(stack) ); stack->top -= 1; return stack->data[stack->top]; } /* スタックから要素を降ろす (成否判定付き) */ bool ppps_int_stack_try_pop(PPPSIntStack stack, int* p) { assert( p != NULL ); if( ppps_int_stack_is_empty(stack) ){ return false; } stack->top -= 1; *p = stack->data[stack->top]; return true; } /* スタックが空かどうか調べる */ bool ppps_int_stack_is_empty(PPPSIntStack stack) { return stack->top <= 0; } /* エラーチェック付きの malloc関数 */ void* xmalloc(size_t size) { void* p = malloc( size ); if( p == NULL ){ fputs( "メモリ割り当てに失敗しました。", stderr ); exit( EXIT_FAILURE ); } return p; }