#include <stdio.h>
#include <stdlib.h>
#define STACK_MAX  20               /* スタックサイズ */
#define STACK_OK   0x8000           /* スタック成功を表すデータ */
#define STACK_FULL STACK_OK + 1     /* スタックサイズを超えたときのデータ */
#define STACK_END  STACK_OK + 2     /* スタックの終わりを表すデータ */
/* 関数のプロトタイプ宣言 */
int     push(int);          /* スタックにデータを積む関数 */
int     pop(void);          /* スタックからデータを取り出す関数 */
/* グローバル変数 */
int     stack[STACK_MAX];   /* スタック領域 [0] - [19] */
int     stack_pointer = 0;  /* スタックポインタ */
 
int main(void)
{
    char s[100]; 
    printf("逆ポーランド記法で書かれた数式を計算します。\n");
    printf("input:");
    scanf("%s",data);
    printf("output:%d\n",res(data));
    return 0;
}
int res(char data[]){
    int i=0,x=0,y=0;
    for(i=0;s[i] != '\0';i++){
        switch(s[i]){
            case '+':
                x = pop();
                y = pop();
                push(x+y);
                break;
            case '-':
                x = pop();
                y = pop();
                push(x-y);
                break;
            case '/':
                x = pop();
                y = pop();
                push(y/x);
                break;
            case '*':
                x = pop();
                y = pop();
                push(x*y);
                break;
            default :
                push(data[i]);
                break;
        }
    }
    return pop();
}
int push(int d)
{
    if(stack_pointer >= STACK_MAX)  /* スタックポインタが最大 */
        return(STACK_FULL);         /* STACK_FULLを返す */
    stack[stack_pointer] = d;       /* スタックにデータ格納 */
    ++stack_pointer;                /* スタックポインタに1加算 */
    return(STACK_OK);               /* STACK_OKを返す */
}
int pop(void)
{
    if(stack_pointer == 0)          /* スタックポインタが0 */
        return(STACK_END);          /* STACK_ENDを返す */
    --stack_pointer;                /* スタックポインタから1減算 */
    return(stack[stack_pointer]);   /* スタックのデータを返す */
}