/* $Id$ */ /* Berlin 26.12.2000 */ #include #include #include #define MAXOP 100 #define NUMBER '0' #define MAXVAL 100 #define BUFSIZE 100 int getop(char[]); void push(double); double pop(void); int sp = 0; double val[MAXVAL]; int getch(void); void ungetch(int); char buf[BUFSIZE]; int bufp = 0; int main(void) { int type; double op2; char s[MAXOP]; while ((type = getop(s)) != EOF) { switch (type) { case NUMBER: push(atof(s)); break; case '+': push(pop() + pop()); break; case '*': push(pop() * pop()); break; case '-': op2 = pop(); push(pop() - op2); break; case '/': op2 = pop(); if (op2 != 0.0) push(pop() / op2); else printf("Fehler: Teilung durch Null\n"); break; case '\n': printf("\t%.8g\n", pop()); break; default: printf("Fehler: Unbekanter Befehl %s\n", s); break; } } return 0; } void push(double f) { if (sp < MAXVAL) val[sp++] = f; else printf("Fehler: Stack ist voll, %g passt nicht rein\n", f); } double pop(void) { if (sp > 0) return val[--sp]; else { printf("Fehler: Stack ist leer\n"); return 0.0; } } int getop(char s[]) { int i, c; while((s[0] = c = getch()) == ' ' || c == '\t'); s[1] = '\0'; if (!isdigit(c) && c != '.') return c; i = 0; if (isdigit(c)) while (isdigit(s[++i] = c = getch())); if (c == '.') while (isdigit(s[++i] = c = getch())); s[i] = '\0'; if (c != EOF) ungetch(c); return NUMBER; } int getch(void) { return(bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if (bufp >= BUFSIZE) printf("Ungetch: Zu viele Zeichen\n"); else buf[bufp++] = c; }