0

I'm writing a reverse Polish calculator. If the input is 1 2 - 4 5 + *, the output should be 9, but I'm getting -9.

Does anyone see where the problem lies?

Thanks!

#include <stdio.h>
#include <stdlib.h> // for atof()
#include <ctype.h>

/* denifitions for main() */
#define MAXOP	100 // max size of operand or operator
#define NUMBER	'0' // signal that a number was found

/* definition for push() */
#define MAXVAL	100 // maximum depth of val stack

/* definition for pop() */
#define BUFSIZE	100 

/* declarations for main() */
int getop(char []);
void push(double);
double pop(void);

/* declarations for push() */
int sp = 0; // next free stack position
double val[MAXVAL]; // value stack

/* declarations for getop() */
int getch(void);
void ungetch(int);

/* external variables for getch() and ungetch() */
char buf[BUFSIZE]; // buffer for ungetch
int bufp = 0; // next free position in buf

/* reverse Polish calculator */
int main() {
	int type;
	double op2;
	char s[MAXOP];

	printf("reverse polish calculator: ");
	
	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("error: zero divisor\n");
			break;
		case '\n':
			printf("print: \t%.8g\n", pop());

			printf("\nPress any key to continue.");
			getchar(); getchar();
			exit(0);
			//break;
		default:
			printf("error: unknown command %s\n", s);
			break;
		}
	}
	return 0;
}

/* push: push f onto value stack */
void push(double f) {
	if (sp < MAXVAL)
		val[sp++] = f;
	else
		printf("error: stack full, can't push %g\n", f);
}

/* pop: pop and return tp value from stack */
double pop(void) {
	if (sp > 0)
		return val[--sp];
	else {
		printf("error: stack empty\n");
		return 0.0;
	}
}

/* getop: get next operator or numeric operand */
int getop(char s[]) {
	int i, c;

	while ((s[0] = c = getch()) == ' ' || c == '\t')
		;
	s[1] = '\0';
	if (!isdigit(c) && c != '.')
		return c; // not a number
	i = 0;
	if (isdigit(c)) // collect integer part
		while (isdigit(s[++i] = c = getch()))
			;
	if (c == '.') // collect fraction part
		while (isdigit(s[++i] = c = getch()))
			;
	s[i] = '\0';
	if (c != EOF)
		ungetch(c);
	return NUMBER;
}

/* get a (possibly pushed back) character */
int getch(void) {
	return (bufp > 0) ? buf[--bufp] : getchar();
}

/* push character back on input */
void ungetch(int c) {
	if (bufp >= BUFSIZE)
		printf("ungetch: too many characters\n");
	else
		buf[bufp++] = c;
}
2
Contributors
1
Reply
3
Views
6 Years
Discussion Span
Last Post by WaltP
1

I'm writing a reverse Polish calculator. If the input is 1 2 - 4 5 + *, the output should be 9, but I'm getting -9.

[u]1 2 -[/u]  [u]4 5 +[/u]  [u]*[/u]
   1-2    4+5
   [u]-1      9    *[/u]
        -1 * 9
          -9

Looks right to me.

Edited by WaltP: n/a

Votes + Comments
Thanks!
This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.