2017-01-03 52 views
0

我試圖構建一個任意精度計算器。 我代表鏈接列表中的數字(一個節點是一個數字),我想將它們存儲在一個堆棧中。 但是,我似乎無法弄清楚如何在保持正確的數學運算順序的同時將接收到的數學表達式拆分爲一個字符串。例如,如果插入的表達式是6*8-2+8-8*9/4,我會將數字表示爲鏈接列表並將它們插入到堆棧中,然後將這些操作符插入到不同的堆棧中,然後我想彈出每個計算的參數,然後再次推算結果,等等,直到我得到最終結果。從字符串評估數學表達式並將其插入到堆棧中

我的問題是,我該如何實現這一點,仍然遵循數學運算的順序?

+0

一個常見的方法是首先將表達式轉換爲[RPN](https://en.wikipedia .org/wiki/Reverse_Polish_notation)使用Dijkstra的[Shunting-yard算法](https://en.wikipedia.org/wiki/Shunting-yard_algorithm) –

+0

首先,使用標準庫的shlex來標記,然後提出語法並實現一個解析器。我發現shift減少了解析器最容易理解和實現的地方。我最近在github上做了一個玩具項目 - 縮節器。 – jbasko

+0

請看這個問題和很好的答覆。 http://stackoverflow.com/questions/28256/equation-expression-parser-with-precedence – rajah9

回答

0

你可以嘗試使用eval

eval("6*8-2+8-8*9/4") 

這將使你36

編輯:

如果EVAL是不可行的,也許嘗試operator字符串運算符將數學的:

import operator 
operations = { 
    '+' : operator.add, 
    '-' : operator.sub, 
    '*' : operator.mul, 
    '/' : operator.div, 
    '%' : operator.mod, 
    '^' : operator.xor 
} 

那麼也許你可以通過字符串循環並評估它的方式? (我現在想想循環部分,並編輯我的答案,如果我有什麼好的)

+0

我希望。這是一個大學項目,我需要按照我寫的那樣完成它。 – mrpink121

+0

啊,夠公平的,我會有一個想法,並更新我的答案,如果我拿出任何有用的東西:) – RichSmith

+0

謝謝你親切先生! – mrpink121