切符の幸せ、プログラム(2)

逆ポーランド記法への変換

日経ソフトウェア2009年7月号特別付録(別冊)「アルゴリズムらくらく学習ブック」の「レッツ・チャレンジ!パソコン甲子園」第9回の解答例が、とてもスマートでシンプル、きれい。

かっこの扱い方がポイント。

上の資料を参考に自分で作った逆ポーランド記法への変換プログラムの核心の部分を抜粋↓
exprss[] : 元の計算式の文字配列
GetPriority() : トークンの優先順位を返す関数。(, 0~9, *, /, +, -, ), B の順 ('B'はスタック最下部を示す)
stack : 作業用スタック(クラス)
rpn : 生成した逆ポーランド記法を入れるスタック(クラス)

//---逆ポーランド記法へ変換---
stack.push( 'B' ) ;
for(i=0; exprss[i] != '\0' ;i++ )
{
while( (GetPriority( exprss[i] ) <= GetPriority(stack.top() ) )&&( stack.top() != '(' ))
{
rpn.push( stack.pop() ) ;
}
if( exprss[i] != ')' )
{
stack.push( exprss[i] ) ;
} else {
stack.pop() ;
}
}
while( GetPriority( (tmp = stack.pop()) ) > GetPriority('B' ) )
rpn.push( tmp ) ;
}