2014-01-06 99 views
1

我創建在Java中的計算器和我在努力想出一種方法來處理負數負數,到目前爲止,我可以解析表達式,比如這個:Java的計算器,如何處理

((4-3)*(4/2))*2 

變爲:

[4.0, -3.0, +, 4.0, 2.0, /, *, 2.0, *] 

但是我不知道我應該怎樣處理含底片,如表情:

2*(-2-3) 

到目前爲止,我有這麼當遇到一個負值,它由-1在它前面的相乘的數量,並增加了+到列表的末尾,這樣的表達變成這樣:

[2.0, -2.0, -3.0, +, +, *] 

這是在我的程序中造成很多錯誤,誰能幫助我們用更好的方法來處理負面問題。

非常感謝您的幫助

+2

你可以通過在任何否定之前添加0來處理它。因此,'2 *( - 2-3)'會變成'2 *(0-2-3)'。 – sp00m

+0

感謝您的快速回復,我試過這個,但是當我有一個像8 * -2這樣的表達式時,我得到了列表[8.0,0.0,*,-2.0,+]這會導致-2 – user3120023

+0

的答案,那麼你解析它錯誤,8 * -2應該是[8,0,2, - ,*],你讀8 => [8],你讀*然後你調用解析下一個參數,你讀 - 和2 = > [8,0,2, - ],現在你完成了* => [8,0,2, - ,*] – Vladp

回答

1

使兩種不同-類型,

一個具有單值的作品,只需轉動它負:

-(2+3) 
[2, 3, +, type1-] 

和第二其工作方式+

2-3 
[2, 3, type2-] 

toge療法,你應該得到:

2--3 
[2, 3, type1-, type2-] 

-2-(-3) 
[2, type1-, 3, type1-, type2-] 

當你遇到-不帶參數的計算,等待它的Type1和Type2否則。

0

嗯,這裏是我的兩分錢的價值:

我懷疑分手包含括號,括號內的公式等爲你做了一個數組將會導致很多的困難。我建議你以編程的方式深入研究最深入的父母,處理數據並向外工作。 Google可能會提供關於如何執行此操作的在線示例。

2

Vladp是正確的,但要補充一些說明。

您正在實施Shunting Yard algorithm以將infix notation轉換爲postfix notation,即AKA反向波蘭標記。

您遇到的問題是您沒有區分binary減法和unary否定-字符/符號/運算符。

所以對於

2*(-2-3) 

你將這個轉換爲AST作爲

 * 
    /\ 
    - (b) 2 
    /\ 
- (u) 3 
/
2 

與 - 是一元否定(U) - (b)的二進制減法和。

或RPN作爲

2-3-2* 

,評估,

2 - 3 - 2 * 
(-2) 3 - 2 * 
(-5) 2 * 
-10 

當你評估一個一元的否定,只取一元運算符和一個數字從堆棧和推動這個數字的負堆棧。一元否定不意味着多個負數,而是將操作數轉換爲負數。

所以-5否定是-5
5否定是-5

當您存儲負號的值時,必須使用兩個不同的運算符,一個用於二進制,一個用於一元。另外,當您評估運算符時,您必須爲單目運算符和二進制運算符有單獨的情況。