前言
花了點時間幫朋友做了一個電腦,以後可能還用得着,留下來存個檔。
聲明
歡迎轉載,但請保留文章原始出處:)
部落格園:http://www.cnblogs.com
農民伯伯: http://over140.cnblogs.com
正文
private textview mnumbertext;
/** 格式化資料 */
private static final decimalformat mformat = new decimalformat(
"###############.######");
/** 堆棧 */
private stack<string> mmathstack = new stack<string>();
/** 操作數 入棧 */
private void push(char obj) {
final int size = mmathstack.size();
// 清除
if ('c' == obj) {
mmathstack.clear();
mnumbertext.settext("0");
return;
}
// 操作符号
if ('+' == obj || '-' == obj || '*' == obj || '/' == obj || '=' == obj) {
switch (size) {
case 0:
break;
case 2:
if ('=' != obj)
mmathstack.set(1, obj + "");// 同時輸入兩個操作符,後面的操作符替換前面的
case 1:
mmathstack.push(obj + "");
case 3:
string preresult = mformat.format(calc());
mmathstack.push(preresult);
mnumbertext.settext(preresult);
}
string str = "";
int location = 0;
switch (size) {
case 0:
mmathstack.push("");
case 1:
str = mmathstack.peek();
break;
case 2:
case 3:
location = 2;
int len = str.length();
if ('d' == obj) {
// 删除
if (len > 1)
str = str.substring(0, len - 1);
else if (len == 1)
str = "0";
} else if ('f' == obj) {
if ("0".equals(str) || len == 0) {
return;
} else if (str.charat(0) == '-') {
str = str.replace('-', ' ').trim();
} else {
str = '-' + str;
} else {
if ('.' == obj) {
if (str.indexof(".") > 0)
return;
} else if ('0' == obj) {
if (str.length() == 0 || str.equals("0"))
str += obj;
if ('.' != obj)
str = mformat.format(parsedouble(str));
mmathstack.set(location, str);
mnumbertext.settext(str);
}
private double calc() {
double result = 0.0d;
if (mmathstack.size() == 3) {
double right = parsedouble(mmathstack.pop());
string oper = mmathstack.pop();
double left = parsedouble(mmathstack.pop());
if ("+".equals(oper)) {
result = left + right;
} else if ("-".equals(oper)) {
result = left - right;
} else if ("*".equals(oper)) {
result = left * right;
} else if ("/".equals(oper)) {
if (right != 0.0d)
result = left / right;
return result;
/** 解析文本資料 */
private double parsedouble(string str) {
try {
return double.parsedouble(str);
} catch (numberformatexception e) {
return 0.0d;
/** 點選事件 */
@override
public void onclick(view v) {
switch (v.getid()) {
case r.id.btndivi:// 除
push('/');
case r.id.btnmult:// 乘
push('*');
case r.id.btnminus:// 減
push('-');
case r.id.btnplus:// 加
push('+');
case r.id.btnclear:// c
push('c');
case r.id.btn0:
push('0');
case r.id.btn1:
push('1');
case r.id.btn2:
push('2');
case r.id.btn3:
push('3');
case r.id.btn4:
push('4');
case r.id.btn5:
push('5');
case r.id.btn6:
push('6');
case r.id.btn7:
push('7');
case r.id.btn8:
push('8');
case r.id.btn9:
push('9');
case r.id.btndot:
push('.');
case r.id.btnequal:// =
push('=');
case r.id.btnpm:// 符号,正負數
push('f');
case r.id.btndel:// <- delete
push('d');
代碼說明:
a). r.id這些全是界面上的按鈕, 分别代表加減乘除、0-9等。
b). 基本原理:利用堆棧模型,一個操作數 + 一個操作符 + 一個操作數 完成一次運算,清空棧,把結果壓入棧底。
c). 最大支援小數點前15位和後6位,大家可以調整一下,隻是注意不要溢出了。
d). ui和代碼就不提供下載下傳了,需要的也可以簡單的封裝一下成一個工具類。
結束
堆棧模型也很好擴充支援其他的運算符,對于簡單運算實作起來很友善,簡單測試了一下沒有問題,有問題歡迎指正 :)
轉載:http://www.cnblogs.com/over140/archive/2012/07/06/2579226.html