Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android使用Stack實現簡易計算器

Android使用Stack實現簡易計算器

編輯:Android開發實例

 

  1.  private TextView mNumberText; 
  2. /** 格式化數據 */ 
  3. private static final DecimalFormat mFormat = new DecimalFormat( 
  4.         "###############.######"); 
  5. /** 堆棧 */ 
  6. private Stack<String> mMathStack = new Stack<String>(); 
  7.  
  8. /** 操作數 入棧 */ 
  9. private void push(char obj) { 
  10.     final int size = mMathStack.size(); 
  11.     // 清除 
  12.     if ('c' == obj) { 
  13.         mMathStack.clear(); 
  14.         mNumberText.setText("0"); 
  15.         return; 
  16.     } 
  17.  
  18.     // 操作符號 
  19.     if ('+' == obj || '-' == obj || '*' == obj || '/' == obj || '=' == obj) { 
  20.         switch (size) { 
  21.         case 0: 
  22.             break; 
  23.         case 2: 
  24.             if ('=' != obj) 
  25.                 mMathStack.set(1, obj + "");// 同時輸入兩個操作符,後面的操作符替換前面的 
  26.             break; 
  27.         case 1: 
  28.             if ('=' != obj) 
  29.                 mMathStack.push(obj + ""); 
  30.             break; 
  31.         case 3: 
  32.             String preResult = mFormat.format(calc()); 
  33.             mMathStack.push(preResult); 
  34.             if ('=' != obj) 
  35.                 mMathStack.push(obj + ""); 
  36.             mNumberText.setText(preResult); 
  37.             break; 
  38.         } 
  39.         return; 
  40.     } 
  41.  
  42.     String str = ""; 
  43.     int location = 0; 
  44.     switch (size) { 
  45.     case 0: 
  46.         mMathStack.push(""); 
  47.     case 1: 
  48.         str = mMathStack.peek(); 
  49.         break; 
  50.     case 2: 
  51.         mMathStack.push(""); 
  52.     case 3: 
  53.         location = 2; 
  54.         str = mMathStack.peek(); 
  55.         break; 
  56.     } 
  57.  
  58.     int len = str.length(); 
  59.     if ('d' == obj) { 
  60.         // 刪除 
  61.         if (len > 1) 
  62.             str = str.substring(0, len - 1); 
  63.         else if (len == 1) 
  64.             str = "0"; 
  65.     } else if ('f' == obj) { 
  66.         if ("0".equals(str) || len == 0) { 
  67.             return; 
  68.         } else if (str.charAt(0) == '-') { 
  69.             str = str.replace('-', ' ').trim(); 
  70.         } else { 
  71.             str = '-' + str; 
  72.         } 
  73.     } else { 
  74.         if ('.' == obj) { 
  75.             if (str.indexOf(".") > 0) 
  76.                 return; 
  77.         } else if ('0' == obj) { 
  78.             if (str.length() == 0 || str.equals("0")) 
  79.                 return; 
  80.         } 
  81.         str += obj; 
  82.     } 
  83.     if ('.' != obj) 
  84.         str = mFormat.format(parseDouble(str)); 
  85.     mMathStack.set(location, str); 
  86.     mNumberText.setText(str); 
  87.  
  88. private double calc() { 
  89.     double result = 0.0D; 
  90.     if (mMathStack.size() == 3) { 
  91.         double right = parseDouble(mMathStack.pop()); 
  92.         String oper = mMathStack.pop(); 
  93.         double left = parseDouble(mMathStack.pop()); 
  94.         if ("+".equals(oper)) { 
  95.             result = left + right; 
  96.         } else if ("-".equals(oper)) { 
  97.             result = left - right; 
  98.         } else if ("*".equals(oper)) { 
  99.             result = left * right; 
  100.         } else if ("/".equals(oper)) { 
  101.             if (right != 0.0D) 
  102.                 result = left / right; 
  103.         } 
  104.     } 
  105.     return result; 
  106.  
  107. /** 解析文本數據 */ 
  108. private double parseDouble(String str) { 
  109.     try { 
  110.         return Double.parseDouble(str); 
  111.     } catch (NumberFormatException e) { 
  112.         return 0.0D; 
  113.     } 
  114.  
  115. /** 點擊事件 */ 
  116. @Override 
  117. public void onClick(View v) { 
  118.     switch (v.getId()) { 
  119.     case R.id.btnDivi:// 除 
  120.         push('/'); 
  121.         break; 
  122.     case R.id.btnMult:// 乘 
  123.         push('*'); 
  124.         break; 
  125.     case R.id.btnMinus:// 減 
  126.         push('-'); 
  127.         break; 
  128.     case R.id.btnPlus:// 加 
  129.         push('+'); 
  130.         break; 
  131.     case R.id.btnClear:// C 
  132.         push('c'); 
  133.         break; 
  134.     case R.id.btn0: 
  135.         push('0'); 
  136.         break; 
  137.     case R.id.btn1: 
  138.         push('1'); 
  139.         break; 
  140.     case R.id.btn2: 
  141.         push('2'); 
  142.         break; 
  143.     case R.id.btn3: 
  144.         push('3'); 
  145.         break; 
  146.     case R.id.btn4: 
  147.         push('4'); 
  148.         break; 
  149.     case R.id.btn5: 
  150.         push('5'); 
  151.         break; 
  152.     case R.id.btn6: 
  153.         push('6'); 
  154.         break; 
  155.     case R.id.btn7: 
  156.         push('7'); 
  157.         break; 
  158.     case R.id.btn8: 
  159.         push('8'); 
  160.         break; 
  161.     case R.id.btn9: 
  162.         push('9'); 
  163.         break; 
  164.     case R.id.btnDot: 
  165.         push('.'); 
  166.         break; 
  167.     case R.id.btnEqual:// = 
  168.         push('='); 
  169.         break; 
  170.     case R.id.btnPM:// 符號,正負數 
  171.         push('f'); 
  172.         break; 
  173.     case R.id.btnDel:// <- delete 
  174.         push('d'); 
  175.         break; 
  176.     } 

代碼說明:

a). R.id這些全是界面上的按鈕, 分別代表加減乘除、0-9等。

b). 基本原理:利用堆棧模型,一個操作數 + 一個操作符 + 一個操作數 完成一次運算,清空棧,把結果壓入棧底。

c). 最大支持小數點前15位和後6位,大家可以調整一下,只是注意不要溢出了。

d). UI和代碼就不提供下載了,需要的也可以簡單的封裝一下成一個工具類。

 

結束

堆棧模型也很好擴展支持其他的運算符,對於簡單運算實現起來很方便,簡單測試了一下沒有問題,有問題歡迎指正  :)

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved