infix記法をpostfix記法(逆ポーランド記法)に変換。
むかしむかしCで書いたんだかどっかから拾ってきたんだか、をみっけた。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int ch;
/* 空白をスキップして読め
*/
void readch() {
do {
if ((ch = getchar()) == EOF) return;
} while (ch == ' ' || ch == '\t');
}
void expression();
/* factor とは ( と ) で囲まれた expression
* もしくは 文字
*/
void factor() {
if ( ch == '(' ) {
readch(); expression();
if (ch == ')') readch(); else putchar('?');
} else if (isgraph(ch)) {
putchar(ch); readch();
} else putchar('?');
}
/* term とは factor * factor
* もしくは factor / factor
*/
void term() {
factor();
for (;;) {
if (ch == '*') {
readch(); factor(); putchar('*');
} else if (ch == '/') {
readch(); factor(); putchar('/');
} else break;
}
}
/* expression とは term + term
* もしくは term - term
*/
void expression() {
term();
for (;;) {
if (ch == '+') {
readch(); term(); putchar('+');
} else if (ch == '-') {
readch(); term(); putchar('-');
} else break;
}
}
/* expression を評価せよ
*/
int main() {
do {
readch(); expression();
while (ch != '\n' && ch != EOF) {
putchar('?'); readch();
}
putchar('\n');
} while (ch != EOF);
return 0;
}
実行結果:
a+b*c+d
abc*+d+
(a+b)*(c+d)
ab+cd+*
a*b+c*d
ab*cd*+