2017-09-02 149 views
1

我想知道是否有人可以幫助這個堆棧問題 有2個主要功能的例子,答案應該是1024和4096,但我會得到100和144 問題必須在evaluate_postfix定義監守我知道Stack類工作堆棧和評估後綴

class Stack: 
def __init__(self): 
    self.items = [] 

def is_empty(self): 
    return self.items == [] 

def push(self, item): 
    self.items.append(item) 

def pop(self): 
    return self.items.pop() 

def peek(self): 
    return self.items[len(self.items)-1] 

def size(self): 
    return len(self.items) 


def evaluate_postfix(text): 
    s = Stack() 
    for element in text: 
      plus = None 
      if element.isdigit(): 
       s.push(int(element)) 
      elif element == '^': 
       plus = s.pop() ** s.pop() 
      elif element == "+": 
       plus = s.pop() + s.pop() 
      elif element == "-": 
       plus = s.pop() - s.pop() 
      elif element == "*": 
       plus = s.pop() * s.pop() 
      elif element == "/": 
       plus = s.pop()/s.pop() 
      if plus is not None: 
       s.push(plus) 
    return s.pop() 



def main(): 
    print(evaluate_postfix(['2', '10', '^'])) 
    print(evaluate_postfix(['2', '4', '3', '*', '^'])) 

main() 
+0

你爲什麼認爲這些答案是正確的?在你的第一個例子中,你推2,推10,然後你得到'^'的第三個元素。如果這應該是「提高最近添加的元素的最新添加元素」,那麼答案是10^2 = 100。如果它的意思是「將最近添加的元素的第二個元素添加到最近添加的元素的權力」中,即2^10 = 1024。任何不可交換的二元運算符都會出現同樣的問題。你的程序沒有錯,但也許你對問題的解釋是。 –

回答

1

pop荷蘭國際集團的權利元素,但以錯誤的順序:

s.pop() ** s.pop() 

一旦你的程序運行到該行,第一個例子, Ť他的籌碼將如下所示:['2', '10']。它pop第10,然後2,然後提出了10 2的乘方相反,你可以使用:

right = s.pop() 
left = s.pop() 
left ** right 

您會收到理想的答案,1024。同樣的原則適用於其他運營商。

+0

堆棧通常不支持從任意索引彈出。相反,你可能想要彈出你需要的所有東西,然後執行操作:'left = s.pop(); right = s.pop; plus = left ** right'等 – mgilson

+0

@mgilson:在實現過程中,我不認爲這會影響項目是如何「流行」的,但是當然您的操作是正確的。我會將其添加到我的答案中。 –

+0

非常感謝 我添加了一個新的def,它工作得很好 – Rera