/* Reverse Poland Notation : implementasi Stack memakai array */
/* Source : http://www.context.co.jp/~cond/books/algo/  */
/* Author : Hiroyuki Kondoh */


#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

typedef	   long	   ELEM;	   /* tipe elemen stack */

#define	   STACK_SIZE  100	   /* maksimum banyaknya elemen stack */

ELEM   stack[STACK_SIZE];	   /* definisi stack */
int    n;			   /* stack pointer */


/* Menampilkan error message dan kemudian exit */
void   error(char *s)
{
    fprintf(stderr, s);
    exit(1);
}

/* Inisialisasi stack */
void   init()
{
    n = 0;
}

/* Menambahkan data (PUSH)  dari stack */
void   push(ELEM x)
{
    if (n >= STACK_SIZE)
	error("stack overflow\n");
    stack[n++] = x;
}

/* Menurunkan data (POP) dari stack */

ELEM   pop()
{
    if (n <= 0)
	error("stack underflow\n");
    return  stack[--n];
}

/*  Memeriksa apakah STACK kosong */
/* Jika kosong return 1, jika berisi return 0*/
int    empty()
{
    return  n == 0;
}

/**********************************************************/

/* Reverse Polish Notation */

main()
{
    int c;
    long    x, a, b;

    init();
    while ((c = getchar()) != EOF) {
	if (isdigit(c)) {
	    ungetc(c, stdin);
	    scanf("%ld", &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 (! empty())
		    printf("Jawabnya : %ld \n", pop());
		init();
		break;
	    case ' ':
	    case '\t':
		/* tidak melakukan apa-apa */
		break;
	    default:
		printf("Ada huruf/kode yang salah \n");
		printf("Masukkan sekali lagi \n");
		while ((c = getchar()) != EOF && c != '\n')
		    ;
		break;
	    }
	}
    }
}

