#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NUM '0'
#define MAX 100
int getop(char []);
double pop(void);
void push(double);
int main(){
  int type;
  double op2;
  char a[MAX];
  while((type = getop(a)) != EOF) {
    switch (type) {
    case NUM:
      push(atof(a));
      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("%d\n", pop());
      break;
    default:
      printf("error: unknown command %s\n", a);
      break;
    }
  }
  return 0;
}

#define MAXVALUE 100

int sp = 0;
double val[MAXVALUE];

/* push: fを値スタックにプッシュする*/
void push(double f)
{
  if (sp < MAXVALUE)
    val[sp++] = f;
  else
    printf("error: stack full, can't push %g\n", f);
}

/* pop: スタックをポップし，一番上の値を返す*/
double pop(void)
{
  if (sp > 0)
    return val[--sp];
  else {
    printf("error: stack empty\n");
    return 0.0;
  }
}

#include <ctype.h>

int getch(void);
void ungetch(int);

/* getop:　次の演算子あるいは数値の被演算数をとってくる*/
int getop(char s[])
{
  int i, c;

  while ((s[0]= c = getch()) == ' ' || c == '\t')
    ;
  s[1] = '\0';
  if (!isdigit(c) && c != '.')
    return c;/*　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 NUM;
}

#define BUF 100

char buf[BUF];
int bufp =0;

int getch(void) /* 1文字を取ってくる */
{
  return (bufp > 0) ? buf[--bufp] : getchar();
}

void ungetch(int c) /* 文字を入力に戻す */
{
  if (bufp >= BUF)
    printf("ungetch: too many characters\n");
  else
    buf[bufp++] = c;
}

