2017-07-13 11 views
0

私は大学のクラスの課題に取り組んでいます。私たちは大括弧で囲まれた数式の文字列を評価するスクリプトを書く必要があります。 )* 2)* 5) ')。また、教授が私たちに提供したこの課題には、スタックとキューを使用する必要があります。私のコードは動作するようになっていますが、適切な出力が得られません。私が間違っていることについての洞察は役に立ちます。ここでインジックスの表記法、スタックとキュー

は、Python 3で書かれた私のコードです:

import isfloat 
import Queue 
import Stack 

def expr_eveluate(expr_string): 
    """ 
    :Pre: Given a mathematical expression, this function 
    evaluates it per pairs of brackets. 
    :Post: The expression must be evaluated per pairs of brackets 
    :param expr_string: A string of mathematical expressions 
    :return: 
    """ 
    # A queue for data to be processed. 
    waiting_line = Queue.create() 
    # A stack where processed operators go. 
    operator_stack = Stack.create() 
    # A stack where processed numbers go. 
    numerical_value = Stack.create() 


    # Put all the items in Queue 
    expr = expr_string.split() 
    for item in expr: 
     Queue.enqueue(waiting_line, item) 

    while not Queue.is_empty(waiting_line): 
     item = Queue.dequeue(waiting_line) 

     if item == '(': 
      pass 
     elif isfloat.isfloat(item): 
      Stack.push(numerical_value, item) 
     elif not isfloat.isfloat(item): 
      Stack.push(operator_stack, item) 
     else: 
      num1 = Stack.pop(numerical_value) 
      num2 = Stack.pop(numerical_value) 
      op = Stack.pop(operator_stack) 
      if op == '*': 
       val = num1 * num2 
       Stack.push(numerical_value, val) 
      if op == '/': 
       val = num1/num2 
       Stack.push(numerical_value, val) 
      if op == '+': 
       val = num1 + num2 
       Stack.push(numerical_value, val) 
      if op == '-': 
       val = num1 - num2 
       Stack.push(numerical_value, val) 
      else: 
       print("Syntax Error") 
       return None 

    return Stack.pop(numerical_value) 
+0

isfloatは私たちの教授が提供する別のモジュールです。文字を浮動小数点に変換しようとします。 –

+0

私はあなたのタイトルで少し混乱しています。逆ポリッシュ表記法では、引数の後に演算子があります(たとえば '1 2 +')が、カッコで通常の表記法を尋ねています(例えば '(1 + 2)')。 – Blckknght

+0

ああ申し訳ありませんが、私は表記自体に慣れていませんが、私の友人はそれがRPNかPostfix表記であると言いました。 –

答えて

0

私はあなたのコードでいくつかの問題を参照してください。ここに概要があります。

  1. 数値を実際の数値型に変換することは決してありません。 isfloat.isfloat(item)の場合は、itemではなく、float(item)numeric_stackにプッシュします。

  2. メインif/elif/elseのチェーンの条件が一致しません。ブロックの順序を変更した場合、おそらく同じロジックを保つことができますが、条件を改善すると現在の順序は問題ないと思います。

    特に、elif not isfloat.isfloat(item):の行では、以前のelifブロックの数値を処理しているので、条件は常にtrueになります。つまり、閉じ括弧が演算子スタックにプッシュされ、elseブロックは決して実行されません。私はあなたが明示的にここに期待されている演算子をテストする必要があると思うが、elif item in ("*", "/", "+", "-"):のようなもので。

    同様に、トップレベルelseブロックはおそらくelif item == ")"である必要があります。これは、処理が期待されるトークンを明示的にテストします。あなたがそれらだけの1時間に実行されることを期待しているので、あなたの現在のelseブロック内

  3. if

  4. はおそらく、 ifelif秒の連鎖でなければなりません。現在、最後の else句は、 -以外の演算子に対して実行され、未知の演算子値では実行されません。

    ブロックと言えば、内部オペレータ処理チェーンの代わりに外側if/elifチェーンの一部になるように、1つのレベルでインデント解除されているはずです。 operator_stackはそれ以上のことが無意味になることはないので、トップレベルの無効なトークンをチェックしたいと思うでしょう。

  5. numeric_stackから2つの数字をポップすると、間違った順序で処理されます。スタックの一番上から来る最初の数字は常にオペレータの右側の値になりますが、ポップされた2番目の数字は左側の値になります。現在、3/44/3と解釈しています。これは、pop呼び出しを行う行にnum1num2をスワップするだけで簡単に修正できます。 rightleftのような変数の名前を変更して、操作の仕方をさらに明確にすることも考えてください。

  6. これはあなたのコードで実際には問題ではありませんが、あなたが示した入力例です。'(((4/3) * 2) * 5)'でコードを実行すると、きつく囲まれたかっこのために正しく処理されません。代わりに'(((4/3) * 2) * 5)'を渡す必要があるため、使用しているsplitコールですべてのトークンが正しく分離されます。あなたの課題の詳細をチェックして、より洗練されたトークナイザを書く必要があるかどうか、あるいはテストに使用する入力についてもっと注意するだけでよいかどうかを確認します。

関連する問題