2017-04-27 12 views
0

Ich versuche, den Code hier http://www.geeksforgeeks.org/expression-evaluation/ in Python zu konvertieren. Ich laufe jedoch in einige Schwierigkeiten und kann nicht herausfinden.Infix-Auswertung in 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)")) 

Ich bin in der Lage, die richtigen Zahlen im valueStack zu bekommen. In den letzten beiden Fällen scheint jedoch ein Problem zu bestehen. Kann mir jemand in die richtige Richtung zeigen?

Antwort

1

Ich habe einige Korrekturen gemacht und es funktioniert für einige Operationen. Aber ich habe es nicht für alle Fälle getestet. Außerdem sind Operationen nur ganze Zahlen, keine Gleitkommazahlen (z. B. die letzte Ausgabe unten prüfen).

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