■ 逆ポーランド表記法/スタック(平成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;
}