与えられた表現ツリーを中置形式で作成したいと思います。式を後置に変換してからツリーを作成する必要がありますか?私は何とか問題自体に依存していることを理解しています。しかし、それは未知数と演算子を持つ数学関数の単純な表現であると仮定します:/ *^+ - 。式ツリーを作成するときに後置に変換する必要がありますか?
0
A
答えて
2
いいえ。式ツリーを構築する場合は、式を後置に変換する必要はありません。解析するときに式ツリーを作成するほうが簡単になります。
私は通常、式のための再帰的降下パーサを書きます。その場合、各再帰呼び出しは、それが解析する部分式のツリーを返します。反復的なshunting-yardのようなアルゴリズムを使いたいなら、それも可能です。
import re
def toTree(infixStr):
# divide string into tokens, and reverse so I can get them in order with pop()
tokens = re.split(r' *([\+\-\*\^/]) *', infixStr)
tokens = [t for t in reversed(tokens) if t!='']
precs = {'+':0 , '-':0, '/':1, '*':1, '^':2}
#convert infix expression tokens to a tree, processing only
#operators above a given precedence
def toTree2(tokens, minprec):
node = tokens.pop()
while len(tokens)>0:
prec = precs[tokens[-1]]
if prec<minprec:
break
op=tokens.pop()
# get the argument on the operator's right
# this will go to the end, or stop at an operator
# with precedence <= prec
arg2 = toTree2(tokens,prec+1)
node = (op, node, arg2)
return node
return toTree2(tokens,0)
print toTree("5+3*4^2+1")
この版画:
ここでのノードのタプルで木を作るPythonで簡単な再帰下降パーサの
( '+'、( '+'、 '5' 、( '*'、 '3'、( '^'、 '4'、 '2')))、 '1')
は、ここでそれを試してみてください。
上記の再帰的降下スタイルは、多くのパーサーを記述した結果であることに注意してください。今私はかなり多くの場合、常にこのように式を解析します(トークン化ではなく再帰的な部分)。式パーザーが可能なだけの簡単さで、括弧を扱いやすくしたり、代入演算子のように右から左に関連付ける演算子も簡単にできます。
関連する問題
- 1. JSONツリーにMySQLのレコードを変換する必要があり
- 2. Javaで式2 + 4 - 3を保存するバイナリ式ツリーを作成する必要があります
- 3. バイトコードをマシンコードに変換する必要がありますか?
- 4. LIBSVMフォーマットに変換する必要がありますか?
- 5. &をURLの&amp;に置き換える必要がありますか?
- 6. テストファイルにヘルパーメソッドを作成する必要がありますか?
- 7. ロジックがあるときに、バッキングフィールドを持つプロパティに変換する必要がありますか?
- 8. WinFormをWebFormに変換する必要があります
- 9. SQLをLINQに変換する必要があります
- 10. これをC++に変換する必要があります
- 11. EMFをjpegに変換する必要があります。
- 12. 作成後にOpenIDE FileObjectを閉じる必要がありますか?
- 13. domツリーに追加するには、append()をbodyタグに配置する必要がありますか?
- 14. ウェーブファイルに変換する必要があります
- 15. 更新後にノーマルモードで行を作成する必要があります
- 16. Android:アップデート後にアプリのショートカットを再作成する必要があります
- 17. 中置式を後置式に変換する
- 18. メンバビルド中にコードスニペットを置き換える必要があります
- 19. Lotus:リモートサーバーにファイルを作成する必要があります
- 20. MediaPlayerをサービスに配置する必要がありますか?
- 21. コールバックをレールアプリケーションに配置する必要がありますか?
- 22. カスタムコントロールをApp_Codeに配置する必要がありますか?
- 23. UITearchViewにUISearchBarを配置する必要がありますか?
- 24. JavaScriptで置換する必要があります。
- 25. 新しいCancellationTokenSource()を作成する必要がありますか。タスクキャンセル後?
- 26. vbaで一般的な形式からテキスト形式に変換する必要があります
- 27. Scene/ScreenごとにViewController.Swiftを作成する必要がありますか?
- 28. 画像ごとにサムファイルを作成する必要がありますか?
- 29. Webページテンプレートごとにモジュールを作成する必要がありますか?
- 30. 画面サイズごとにフラッシュファイルを作成する必要がありますか?