入力文字列を逐次数であるか演算子であるかを見る必要がありますが, 次の処理をしています.
+ - * /
なら, 演算を実行してスタックに積む.
上の方針で書いたのが次のプログラムです。 方針の 2以降は, case文を用いて分岐しています.
#include <stdio.h> #define STACKSIZE 1024 int stack[STACKSIZE]; int n=0; void push(int x) { if ( n >= STACKSIZE){ fprintf(stderr, "stack overflow\n"); n=0; } n++; stack[n]=x; } int pop() { /************************************************** レポート問題 ***************************************************/ } main() { int c; long x, a, b; while ((c=getchar())!=EOF){ if (isdigit(c)){ ungetc(c, stdin); scanf("%d", &x); push(x); } else { switch(c) { case '+': b=pop(); a=pop(); push(a+b); break; case '-': b=pop(); a=pop(); push(a-b); break; case '*': b=pop(); a=pop(); push(a*b); break; case '/': b=pop(); a=pop(); push(a/b); break; case '\n': if (n==1){ printf("The answer is %d.\n", pop()); } else { printf("Invalid expression.\n"); n=0; } case ' ': break; case '\t': break; default: printf("Invalid input.\n"); n=0; break; } } } }
コンパイルが終れば, ./a.out でプログラムが起動するはずです. 逆ポーランド記法で計算式を入力してみて下さい. 演算子や被演算子の等の区切りは, 空白で入れます. 終了は CTRL+d です.