#include #include typedef struct stack { int data; struct stack *nextPtr; } STACK; STACK *push(STACK *stackPtr, int data); STACK *pop(STACK *stackPtr, int *data); int isEmpty(STACK *stackPtr); void print_stack(STACK *stackPtr); void usage(void); void usage(void) { printf("使い方 1: スタックに値を push する\n"); printf(" 2: スタックから値を pop する\n"); printf(" 3: スタックを印刷する\n"); printf(" 4: 終了\n"); } int main(void) { STACK *stackPtr = NULL; int data; int menu; usage(); printf("メニュー番号を入力してください:"); scanf("%d", &menu); while(menu != 4) { switch(menu) { case 1: printf("スタックに push する整数を入力してください:"); scanf("%d", &data); stackPtr = push(stackPtr, data); print_stack(stackPtr); break; case 2: if ( !isEmpty(stackPtr) ) { stackPtr = pop(stackPtr, &data); printf("pop した値は %d です\n", data); } else { printf("スタックは空です\n"); } break; case 3: if ( !isEmpty(stackPtr) ) print_stack(stackPtr); else printf("スタックは空です\n"); break; default: printf("番号が不正です\n"); usage(); break; } printf("メニュー番号を入力してください:"); scanf("%d", &menu); } return 0; } int isEmpty(STACK *stackPtr) { return stackPtr == NULL; } STACK *push(STACK *topPtr, int data) { STACK *newPtr; newPtr = (STACK *)malloc(sizeof(STACK)); if ( newPtr != NULL ) { newPtr->data = data; newPtr->nextPtr = topPtr; topPtr = newPtr; } else { printf("メモリが足りません\n"); } return topPtr; } STACK *pop(STACK *topPtr, int *pop_value) { STACK *tmpPtr; tmpPtr = topPtr; *pop_value = topPtr->data; topPtr = topPtr->nextPtr; free(tmpPtr); return topPtr; } void print_stack(STACK *stackPtr) { if (stackPtr == NULL) { printf("スタックは空です\n"); } else { while ( stackPtr != NULL ) { printf("%d-> ", stackPtr->data); stackPtr = stackPtr->nextPtr; } printf("NULL\n\n"); } }