C言語で書いてみました

過去の情報処理技術者試験の出題をもとにして、Cのソースを起こしてみました。

■ 逆ポーランド表記法/スタック(平成15年春期午後問4)

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

/* 基本情報 平成15年春期午後問4 */
/* 逆ポーランド表記法/スタック */
#define MAX         1000
#define ToReal(x)   (x-'0')
#define Abort()     abort()
#define true        1
#define false       0
#define IsNum(x)    ((x>='0')&&(x<='9'))

int Sp = 0;
double Stack[MAX+1];

void Push(double T)
{
    if (Sp <= MAX) {
        Stack[Sp] = T;
        Sp++;
    } else {
        Abort();
    }
}

void Pop(double *T)
{
    if (Sp > 0) {
        Sp--;
        *T = Stack[Sp];
    } else {
        Abort();
    }
}

void Calc(char Ex[], int Lp, double *Ret)
{
    int Cp;
    double X, Y, T;
    int NumF, NegF;
    Cp = 0;
    T = 0;
    NumF = false;
    NegF = false;
    while (Cp <= Lp) {
        if (IsNum(Ex[Cp])) {
            T = T * 10 + ToReal(Ex[Cp]);
            NumF = true;
        } else {
            if (NumF == true) {
                if (NegF == true) {
                    T = -T;
                    NegF = false;
                }
                Push(T);
                T = 0;
                NumF = false;
            }
            if (Ex[Cp] == '+') {
                Pop(&Y);
                Pop(&X);
                T = X + Y;
                Push(T);
                T = 0;
            }
            if (Ex[Cp] == '-') {
                if (Cp != Lp && IsNum(Ex[Cp+1])) {
                    NegF = true;
                } else {
                    Pop(&Y);
                    Pop(&X);
                    T = X - Y;
                    Push(T);
                    T = 0;
                }
            }
            if (Ex[Cp] == '*') {
                Pop(&Y);
                Pop(&X);
                T = X * Y;
                Push(T);
                T = 0;
            }
            if (Ex[Cp] == '/') {
                Pop(&Y);
                Pop(&X);
                if (Y == 0)
                    Abort();
                else
                    T = X / Y;
                Push(T);
                T = 0;
            }           
        }
        Cp++;
    }
    Pop(Ret);
}

int main()
{
    double Ret;
    Calc("1 2+ 3 4-*", 9, &Ret);
    printf("(1+2)*(3-4)=%f\n", Ret);
    Calc("12 -345/", 7, &Ret);
    printf("12/(-345)=%f\n", Ret);
    return 0;
}