直接對double型別的資料進行計算,很容易發生精度丟失問題
使用bigdecimal類計算,可以避免精度丟失
//double num2 = double.parsedouble(numstack.pop());
//double num1 = double.parsedouble(numstack.pop());
bigdecimal num2 =
newbigdecimal
(numstack.
pop())
; bigdecimal num1 =
newbigdecimal
(numstack.
pop())
;if(arrays[i]
.equals
("+"))
else
if(arrays[i]
.equals
("-"))
else
if(arrays[i]
.equals
("*"))
else
if(arrays[i]
.equals
("/"))
為了完成多個資料的組合運算,這裡使用棧對運算子和運算數進行管理
設計乙個存放字串物件的棧類
public
class
stack
public
intgetsize()
public string peek()
else
}public string pop()
else
}public
void
push
(string o)
@override
public string tostring()
}
計算類
public
class
compute
/* 將字串分割成運算元和操作符的字串陣列
*/public
static string[
]strtoarrays
(string str)
else}}
arrays[arraysindex]
= str.
substring
(beginindex, str.
length()
);string[
] arrays2 =
newstring
[arraysindex+1]
;for
(int i =
0; i < arraysindex+
1; i++
)return arrays2;}/*
將中綴表示式轉為字尾表示式,返回的是字串陣列
*/public
static string[
]topostorder
(string[
] arrays)
else
//操作符為")"時棧頂出棧並輸出,直到遇到"(", "("出棧,")"不入棧
else
if( arrays[i]
.equals
(")"))
operstack.
pop();
//"("出棧
}//其他操作符需要比較與棧頂的優先順序
else
else
//優先順序低或者相等,棧頂出棧並輸出,直到優先順序比棧頂高
else}if
(getpriority
(arrays[i]
.charat(0
))>
getpriority
(operstack.
peek()
.charat(0
)))}
}}}}
//運算元直接新增到 字串陣列2
elseif(
isnum
(arrays[i]))
else
}while
(!operstack.
isempty()
) string[
] arrays3 =
newstring
[tempindex]
;for
(int i =
0; i < tempindex ;i++
)return arrays3;}/*
得到操作符的優先順序
*/public
static
intgetpriority
(char c)
else
if(c ==
'+'|| c ==
'-')
else}/*
由字尾表示式計算得值
*/public
static bigdecimal tocompute
(string[
] arrays)
elseif(
isoper
(arrays[i]))
else
if(arrays[i]
.equals
("-"))
else
if(arrays[i]
.equals
("*"))
else
if(arrays[i]
.equals
("/"))
else
}else
}//double result = double.parsedouble(numstack.pop());
bigdecimal result =
newbigdecimal
(numstack.
pop())
;return result;}/*
判斷該字串是否為操作符
*/public
static
boolean
isoper
(string str)
else}/*
判斷該字串是否為運算元
用棧解決四則運算問題
本文章的解決方法參考了 大話資料結構 中關於棧的應用介紹 值得注意的是,書中關於中綴表示式轉字尾的講解中不盡清楚。本人也在這裡花了點時間進行推敲錯誤的原因,也在網上搜到了這篇文章,比較好地介紹了中綴轉字尾的的規則 原理 用計算機求解四則運算,可以使用棧。因為棧的 先進後出 的特性正好滿足了能通過字尾...
資料結構 四則運算
1.平時我們所接觸到的四則運算都是中序表示式,而要進行程式設計計算時要考慮符號優先順序神馬的很麻煩,故通常將其轉換為前序表示式或者後序表示式 中序表示式 2 3 2 1 3 4 1 前序表示式 23 21 3 41 後序表示式 23 21 341 2.中序轉前序 1.將中序表示式逆 1 4 3 1 ...
資料結構 四則運算
1 c語言實現科學計算器 2 c語言實現四則運算 小型計算器 3 經典演算法 算術表示式求值 4 棧 的典型應用 表示式求值 c語言實現 5 利用c語言 easyx圖形設計 製作簡易計算器 6 從鍵盤上輸入乙個字尾表示式,試編寫演算法計算表示式的值。規定 逆波蘭表示式的長度不超過一行,以符作為 輸入...