
#include <stdio.h>


#define SIZE 10

double stack[SIZE];
int sp;

void push(double value);
double pop(void);
int isFull(void);
int isEmpty(void);
void answer(void);
void reset(void);

int main(void) {
    int choice;
    double data, a, b;

    reset();

    /* (1) main関数内の処理 loop & switch文 */
    while (1) {
        printf("1:+, 2:-, 3:*, 4:/, 5:Push, 9:Answer -> ");
        if (scanf("%d", &choice) != 1) break;

        if (choice == 9) {
            break;
        }

        switch (choice) {
            case 1: /* 足し算 (+) */
                b = pop();
                a = pop();
                push(a + b);
                break;
            case 2: /* 引き算 (-) */
                b = pop();
                a = pop();
                push(a - b);
                break;
            case 3: /* 掛け算 (*) */
                b = pop();
                a = pop();
                push(a * b);
                break;
            case 4: /* 割り算 (/) */
                b = pop();
                a = pop();
                if (b != 0) {
                    push(a / b);
                } else {
                    printf("Error: Zero division\n");
                }
                break;
            case 5: /* データ入力 (Push) */
                printf("Data: ");
                scanf("%lf", &data);
                push(data);
                break;
            default:
                printf("Invalid choice\n");
                break;
        }
    }

    answer();
    return 0;
}

/* (2) reset関数：スタックのポインタを初期化 */
void reset(void) {
    sp = 0;
}

/* (3) answer関数：計算結果（スタックの一番上の値）を表示 */
void answer(void) {
    if (!isEmpty()) {
        printf("answer = %f\n", stack[sp - 1]);
    } else {
        printf("Stack is empty\n");
    }
}

/* (4) isEmpty関数：スタックが空かどうかを判断 */
int isEmpty(void) {
    return (sp == 0);
}

/* (5) isFull関数：スタックが満杯かどうかを判断 */
int isFull(void) {
    return (sp == SIZE);
}

/* (6) pop関数：データをスタックから取り出す */
double pop(void) {
    if (!isEmpty()) {
        sp--;
        return stack[sp];
    } else {
        printf("Stack Underflow\n");
        return 0;
    }
}

/* (7) push関数：データをスタックに格納する */
void push(double value) {
    if (!isFull()) {
        stack[sp] = value;
        sp++;
    } else {
        printf("Stack Overflow\n");
    }
}