2017-04-27 76 views
0

我試圖在這裏將代碼http://www.geeksforgeeks.org/expression-evaluation/轉換爲python。但是,我遇到了一些麻煩,無法弄清楚。在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中獲得正確的數字。但是,最後兩個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