/*
  
*/
#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define OP_MAX 100
#define BUFSIZE 8

int pop(int op[]);
void push(int op[], int);
int isFull();
int isEmpty();

int top = 0;     /*スタックの一番上の要素の添え字を表す*/

int main()
{
  int opL, opR, tmp, op[OP_MAX];
  char buf[BUFSIZE];

  while(1)
    {
      if( scanf("%s", buf) == EOF )
	break;

      /*読み込んだものが演算子だった場合*/
      if( buf[0] == '+' || buf[0] == '-' || buf[0] == '*' )
	{
	  opR = pop(op);
	  opL = pop(op);

	  switch( buf[0] )
	    {
	     case '+':
	       tmp = opR + opL;
	       break;
	     case '-':
	       tmp = opL - opR;
	       break;
	     case '*':
	       tmp = opR * opL;
	       break;
	     defalut:
	       exit(4);
	    }
	  push(op, tmp);
	}
      else
	{
	  /* 読み込んだものが数値だった場合 */
	  tmp = atoi(buf);
	  push(op, tmp);
	}
    }

  /* 計算結果を出力 */
  printf("%d\n", pop(op));

  return 0;
}

/* スタックからデータをpopする関数 
   戻り値： 取り出したデータ    */
int pop(int op[])
{
  if( isEmpty() == TRUE )
    {
      fprintf(stderr, "Error! underflow\n");
      exit(2);
    }

  return op[top--];
}


/* スタックにデータをpushする関数 */
void push(int op[], int data)
{
  if( isFull() == TRUE )
    {
      fprintf(stderr, "Error! overflow\n");
      exit(3);
    }

  op[++top] = data;
}


/* スタックか空であるか判定する関数 
   戻り値： 空->TRUE  空でない->FALSE */
int isEmpty(void)
{
  if( top == 0 )
    return TRUE;
  else
    return FALSE;
}


/* スタックが満杯であるか判定する関数
   戻り値： 満杯->TRUE 空がある->FALSE */
int isFull(void)
{
  if( top == OP_MAX )
    return TRUE;
  else
    return FALSE;
}

