2005年秋期
普通の数式をスタックを使って後置表記法に変換するプログラムです。
<変換の優先度>
・( …4
・0~9までの数字 …3
・×、÷ …2
・+、- …1
・) …0
スタックの底は制御文字「EOS」が入ります。優先度はー1です。
プログラムは以下の通りです。
・initStack()
・k ← 0
■i : 0, i < Textlen, 1
| ■getPriority(Exptext[i] <= getPriority(top()) and top() != "("
| |・Postfix[k] ← pop()
| |・k ← k + 1
| ■
| ↑Exptext[i] != ")"
| | ・push(Exptext[i])
| ------------------
| | ・pop() /* 取り出した要素は使わない */
| ↓
■
配列Exptextから取り出した文字が ")" だった時の処理 pop() がよくわかりません。これはスタックから取り出すんですよね? スタックの先頭から取り出したその文字を次にどうするのかがわかりません。
この問題は配列Exptextの例として (2+4)×3+5×6 を取り上げてるんですが、トレースしていくとどうしても5番目の文字で止まってしまいます。回答の処理の流れを見てもいまいちわかりません。またコメントの「取り出した要素は使わない」というのもよくわからないというか、このプログラムの処理後の文字列は "(" と ")" が消えているので多分これのことを言っているんだろうなとはなんとなく思うのですが、トレースしていくと「???」となってしまいます。どなたか教えてください。
リンク内容
午後問題の14~18pです。
【トレース手順】
・最初の文字 "(" の処理
⇒ スタックの先頭文字 (EOS) の方が優先度が低い
⇒スタックに "(" を格納
・2番目の文字 "2" の処理
⇒スタックの先頭文字の方が優先度が高いが "(" である
⇒スタックに "2" を格納
・3番目の文字 "+" の処理
⇒スタックの先頭文字の方が優先度が高い
⇒Postfix[0] に "2" を代入
⇒スタックに "+" を格納
・4番目の文字 "4" の処理
⇒スタックの先頭文字の方が優先度が低い
⇒スタックに "4" を格納
・5番目の文字 ")" の処理
⇒スタックの先頭文字の方が優先度が高い
⇒Postfix[1] に "4" を代入
ここでどうしても止まってしまいます。この時点で
Postfix 【24】
スタック 【+(EOS】
になっていますよね? 回答によるとこの次は
Postfix 【24+】
スタック 【(EOS】
になるということですが、pop() で "+" を取り出すにしてもそれをPostfixに代入する処理がないような…
あとこの ")" の処理が終わった後スタックは【EOS】だけになっているそうなのですが、いつのまにか "(" が消えています。これも一体何なのでしょうか。
回答3件
あなたの回答
tips
プレビュー