2017-04-27 8 views
0

ここでコードをhttp://www.geeksforgeeks.org/expression-evaluation/に変換しようとしています。しかし、私はいくつかの問題に遭遇していると把握することはできません。Pythonでのインフィクス評価

class evaluateString: 

def evalString(self,expression): 
    valueStack = [] 
    opStack = [] 
    i=0 
    while(i<len(expression)): 
     if(expression[i] == ' '): 
      continue 
     if(expression[i]>='0' and expression[i] <= '9'): 
      charNumber = [] #for storing number 
      while(i<len(expression) and expression[i]>='0' and expression[i] <= '9'): 
       charNumber.append(expression[i]) 
       i+=1 
      valueStack.append(int(''.join(charNumber))) 

     elif (expression[i]=='('): 
      opStack.append(expression[i]) 

     elif (expression[i]==')'): 
      while(opStack[-1]!='('): 
       valueStack.append(self.applyOperation(opStack.pop(),valueStack.pop(),valueStack.pop())) 
       opStack.pop() 
     elif(expression[i]=='+'or expression[i]=='-'or expression[i]=='*'or expression[i]=='/'): 
      while((len(opStack)!=0) and (self.opPrecedence(expression[i],opStack[-1]))): 
       valueStack.append(self.applyOperation(opStack.pop(),valueStack.pop(),valueStack.pop())) 
       opStack.append(expression[i]) 
     i = i + 1 

    while(len(opStack)!=0): 
     valueStack.append(self.applyOperation(opStack.pop(),valueStack.pop(),valueStack.pop())) 

    return valueStack.pop() 


def applyOperation(self,op,a,b): 
    if op=='+': 
     return a+b 
    elif op=='-': 
     return a-b 
    elif op=='*': 
     return a*b 
    elif op=='/': 
     return a/b 
    else: 
     return 0 

def opPrecedence(self,op1,op2): 
    if (op2 == '(' or op2 == ')'): 
     return False 
    if ((op1 == '*' or op1 == '/') and (op2 == '+' or op2 == '-')): 
     return False 
    else: 
     return True 

a = evaluateString() 
print(a.evalString("(5+7)")) 

私はvalueStackで正しい数値を取得することができます。しかし、最後の2つのelseifに問題があるようです。誰かが私を正しい方向に向けることができますか?

答えて

1

私はいくつかの修正を行い、いくつかの操作で動作します。しかし、私はすべてのケースでそれをテストしていません。また、演算は整数のみであり、浮動小数点数はありません(例えば、下の最終出力をチェックします)。

class evaluateString: 

    def evalString(self,expression): 
    valueStack = [] 
    opStack = [] 
    i=0 

    while(i<len(expression)): 
     if(expression[i] == ' '): 
      continue 
     if(expression[i]>='0' and expression[i] <= '9'): 
      charNumber = [] #for storing number 
      j = i 
      while(j<len(expression) and expression[j]>='0' and expression[j] <= '9'): 
       charNumber.append(expression[j]) 
       j += 1 

      i = (j-1) 
      valueStack.append(int(''.join(charNumber))) 

     elif (expression[i]=='('): 
      opStack.append(expression[i]) 

     elif (expression[i]==')'): 
      while(opStack[-1]!='('): 
       valueStack.append(self.applyOperation(opStack.pop(),valueStack.pop(),valueStack.pop())) 
      opStack.pop() 
     elif(expression[i]=='+'or expression[i]=='-'or expression[i]=='*'or expression[i]=='/'): 
      while((len(opStack)!=0) and (self.opPrecedence(expression[i],opStack[-1]))): 
       valueStack.append(self.applyOperation(opStack.pop(),valueStack.pop(),valueStack.pop())) 
      opStack.append(expression[i]) 
     i = i + 1 

    while(len(opStack)!=0): 
     valueStack.append(self.applyOperation(opStack.pop(),valueStack.pop(),valueStack.pop())) 

    return valueStack.pop() 


    def applyOperation(self,op,a,b): 
    if op=='+': 
     return a+b 
    elif op=='-': 
     return b-a 
    elif op=='*': 
     return a*b 
    elif op=='/': 
     return b/a 
    else: 
     return 0 

    def opPrecedence(self,op1,op2): 
    if (op2 == '(' or op2 == ')'): 
     return False 
    if ((op1 == '*' or op1 == '/') and (op2 == '+' or op2 == '-')): 
     return False 
    else: 
     return True 

a = evaluateString() 
print(a.evalString("8*12"))  #prints 96 
print(a.evalString("(122-434)")) #prints -312 
print(a.evalString("(232+12)/2")) #print 122 
print(a.evalString("232/12+2")) #prints 21