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*+