#include #include #include #define BUFF_SIZE 100 int stack[100]; int stack_used; int debug = 1; int emptystack(){ if (stack_used == 0) return 1; return 0; } void initstack(){ stack_used = 0; } void push(int x){ stack[stack_used] = x; stack_used++; } int pop(){ if(emptystack()){ fprintf(stderr, "##### スタックが空になっています\n"); return 0; } stack_used--; return stack[stack_used]; } int top(){ return stack[stack_used-1]; } void print_stack(){ int *s = stack; printf("スタックの中身:"); while(s < &stack[stack_used]){ printf(" %d", *s); s++; } printf("\n"); } void space_compile(char *array, int size){ int i = 0, j, ct; while(i < size){ if(array[i] == ' '){ ct = 0; while(array[i+1+ct] == ' ') ct++; for(j = i + 1; j < size; j++) array[j] = array[j+ct]; while(ct < 0){ array[j+ct] = ' '; j--; } } i++; } } int main(){ int head, next; char *input, buf[BUFF_SIZE]; while(1){ fgets(buf, sizeof(buf), stdin); space_compile(buf, sizeof(buf)); input = buf; if(*input == 'q'){ printf("入力を終了します\n"); break; } for(head = 0; head < strlen(input); head = next+1){ next = head; while(input[next] != ' ' && input[next] != '\0')next++; if(isdigit(input[head])){ int num; sscanf(&input[head], "%d", &num); if(debug) printf("<- %d (数値)\n", num); push(num); } else{ int num1, num2, answer; switch(input[head]){ case '+': if(debug) printf("<- '+' (演算子)\n"); num1 = pop(); num2 = pop(); answer = num2 + num1; push(answer); break; case '-': if(debug) printf("<- '-' (演算子)\n"); num1 = pop(); num2 = pop(); answer = num2 - num1; push(answer); break; case '*': if(debug) printf("<- '*' (演算子)\n"); num1 = pop(); num2 = pop(); answer = num2 * num1; push(answer); break; case '/': if(debug) printf("<- '/' (演算子)\n"); num1 = pop(); num2 = pop(); answer = num2 / num1; push(answer); break; default: fprintf(stderr, "##### '%c' は未知の演算子です\n", input[head]); } } if(debug) print_stack(); } } printf("答え %d\n", top()); return 0; }