05/10/16 09:58:58
>>34
それを言われると痛い…….でも中置では全ての式の生成がちょっとややこしくならない?
後置だと↓な感じで再帰回して済むんだけど.
#include <stdio.h>
#include <limits.h>
#include <math.h>
#include <string.h>
#define calc(stack, top, op) \
if (top < 2) return INT_MIN; \
if (#op[0] == '/' && stack[top-1] == stack[top-2]) return INT_MIN; \
stack[top-2] = stack[top-2] op stack[top-1]; --top;
double eval(char* p) {
double stack[100], d;
int top;
for (top = 0; *p != '\0'; ++p)
switch (*p) {
case '+': calc(stack, top, +); break;
case '-': calc(stack, top, -); break;
case '*': calc(stack, top, *); break;
case '/': calc(stack, top, /); break;
default: stack[top++] = *p - '0';
}
return top == 1 ? stack[0] : INT_MIN;
}