#include #include #include 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"); } int main(int argc, char *argv[]){ int head, next; char *input; if(argc <= 1){ fprintf(stderr, "##### コマンドライン引数で逆ポーランド記法を入力してください\n"); return 1; } input = argv[1]; 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; }