3

私は小さな計算機(接頭辞表記を使用)を書いていますが、接頭辞表記を中置記法に変換する方法に興味があります。私は現在関数を持っていますが、それは奇妙であり、それを修正する方法がわかりません。奇妙であるということは、与えられれば['+', x, y]それが戻っ(() + x + () + y)てくるということを意味し、それは私を混乱させます。これがコードです。

def pre_in(read):
    #print read
    tempOp = read[0]
    body = read[1:]
    expr = []
    for i in range(len(body)-1):
        if not isinstance(body[i], list) and body[i] != " ":
            expr.append(str(body[i]))
            expr.append(tempOp)
        else:
            expr.append(str(pre_in(body[i])))
            expr.append(tempOp)
    try:
        if not isinstance(body[-1], list):
            expr.append(str(body[-1]))
        else:
            expr.append(str(pre_in(body[-1])))
    except:
        pass
    if expr != None: return "("+' '.join(expr)+")"

私は何が間違っているのですか?

4

4 に答える 4

4

実際、コードは正常に機能します。

print pre_in ( ['+', 8, 9] )

収量

(8 + 9)

編集:他の人が述べているように、おそらくあなたはスタックを使いたいでしょう。ここにいくつかの例を含む単純なサンドボックスの実装があります(多くの括弧が生成されますが、それらは害にはなりません):

class Calculator:
    def __init__ (self):
        self.stack = []

    def push (self, p):
        if p in ['+', '-', '*', '/']:
            op1 = self.stack.pop ()
            op2 = self.stack.pop ()
            self.stack.append ('(%s %s %s)' % (op1, p, op2) )
        elif p == '!':
            op = self.stack.pop ()
            self.stack.append ('%s!' % (op) )
        elif p in ['sin', 'cos', 'tan']:
            op = self.stack.pop ()
            self.stack.append ('%s(%s)' % (p, op) )
        else:
            self.stack.append (p)

    def convert (self, l):
        l.reverse ()
        for e in l:
            self.push (e)
        return self.stack.pop ()

c = Calculator ()

print c.convert ( ['+', 8, 9] )
print c.convert ( ['!', 42] )
print c.convert ( ['sin', 'pi'] )
print c.convert ( ['+', 'sin', '/', 'x', 2, 'cos', '/', 'x', 3] )
于 2011-06-27T20:16:17.410 に答える
1

自分でアルゴリズムを開発することが目的でない場合は、このページにアクセスしてください。infix->postfixおよびpostfix->infixアルゴリズムを説明する2つのページへのリンクがあります。(また、アルゴリズムがjavascriptでどのように実装されているかを知りたい場合は、ページのソースコードを確認できます。)

于 2011-06-27T20:13:58.297 に答える
1

この種の単純な構文解析/変換ジョブでは少しやり過ぎになるリスクがありますが、pyparsingを検討することをお勧めします。

于 2011-06-27T20:22:45.177 に答える
1

これはかなり単純な再帰的ソリューションです。

def prefix_to_infix(expr):
    if type(expr) != type([]):
        # The expression is a number or variable.
        return str(expr)
    elif len(expr) == 2:
        # This is an operator expression with 1 argument.
        return str(expr[1])
    else:
        # This is an operator expression with 2 or more arguments.
        operator = expr[0]
        left_arg = prefix_to_infix([operator] + expr[1:-1])
        right_arg = prefix_to_infix(expr[-1])
        return "({0}{1}{2})".format(left_arg, operator, right_arg)

# prefix_to_infix(['+',1,2,3,4,5]) = '((((1+2)+3)+4)+5)'
# prefix_to_infix(['+',1,2,['*',3,4,5],6,7,8]) = '(((((1+2)+(3*4*5))+6)+7)+8)'
于 2012-06-22T20:05:30.913 に答える