逆ポーランドで電卓
100 10 + = 110
この答えを下のようにするには、どうしたらいいですか?
[100] [10] + = 110
教えて下さい。
下にプログラムを書いて置いたので、指摘をして下さい。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define isSpace(c) isspace((c) & 0xFF)
#define isDigit(c) isdigit((c) & 0xFF)
#define isAlpha(c) isalpha((c) & 0xFF)
char buf[1024], buf2[1024], *p, *p2, c, o[] = "+-*/";
int get(void) { do c = *p++; while (isSpace(c)); return c; }
void expr(const char *s)
{
char c2;
if (*s)
for (expr(s+2); c==s[0] || c==s[1]; )
c2 = c, expr(s+2), p2 += sprintf(p2, " %c", c2);
else if (get() == '.' || isDigit(c))
p2 += sprintf(p2, " %.15g", strtod(p-1, &p)), get();
else if (c == '(') expr(o), c == ')' ? get() : (c = 1);
else if (c == '-') expr(s), p2 += sprintf(p2, " _");
else if (isAlpha(c)) exit(0);
else c = 1;
}
double calc(char *p)
{
double v[100]; int i = 0;
for(;;)
switch (*p++) {
case '\0': return v[i-1];
case ' ': break;
case '_': v[i-1] = -v[i-1]; break;
case '+': --i; v[i-1] += v[i]; break;
case '-': --i; v[i-1] -= v[i]; break;
case '*': --i; v[i-1] *= v[i]; break;
case '/': --i; v[i-1] /= v[i]; break;
default: v[i++] = strtod(p-1, &p); break;
}
}
int main(void)
{
(fgets(p = buf, sizeof buf, stdin));
*(p2 = buf2) = 0,expr(o),
c ? puts(" エラー") : printf("%s = %.15g\n", buf2, calc(buf2));
return 0;
}
お礼
回答ありがとうございます。 こんなサイトがあるんですね。 シーズン別検索、サブタイトルで分かれていて分かりやすいです。 ただ英語ができないため(何となくしか)もう少し回答を待ってみようとおもいます。 ありがとうございました。