[Android]使用Stack實現簡易計算器


 

前言

花了點時間幫朋友做了一個計算器,以后可能還用得着,留下來存個檔。

 

聲明
  歡迎轉載,但請保留文章原始出處:) 
    博客園: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 + ""); //  同時輸入兩個操作符,后面的操作符替換前面的
                 break;
             case 1:
                 if ('=' != obj)
                    mMathStack.push(obj + "");
                 break;
             case 3:
                String preResult = mFormat.format(calc());
                mMathStack.push(preResult);
                 if ('=' != obj)
                    mMathStack.push(obj + "");
                mNumberText.setText(preResult);
                 break;
            }
             return;
        }

        String str = "";
         int location = 0;
         switch (size) {
         case 0:
            mMathStack.push("");
         case 1:
            str = mMathStack.peek();
             break;
         case 2:
            mMathStack.push("");
         case 3:
            location = 2;
            str = mMathStack.peek();
             break;
        }

         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"))
                     return;
            }
            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('/');
             break;
         case R.id.btnMult: //  乘
            push('*');
             break;
         case R.id.btnMinus: //  減
            push('-');
             break;
         case R.id.btnPlus: //  加
            push('+');
             break;
         case R.id.btnClear: //  C
            push('c');
             break;
         case R.id.btn0:
            push('0');
             break;
         case R.id.btn1:
            push('1');
             break;
         case R.id.btn2:
            push('2');
             break;
         case R.id.btn3:
            push('3');
             break;
         case R.id.btn4:
            push('4');
             break;
         case R.id.btn5:
            push('5');
             break;
         case R.id.btn6:
            push('6');
             break;
         case R.id.btn7:
            push('7');
             break;
         case R.id.btn8:
            push('8');
             break;
         case R.id.btn9:
            push('9');
             break;
         case R.id.btnDot:
            push('.');
             break;
         case R.id.btnEqual: //  =
            push('=');
             break;
         case R.id.btnPM: //  符號,正負數
            push('f');
             break;
         case R.id.btnDel: //  <- delete
            push('d');
             break;
        }
    }

 

代碼說明:

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

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

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

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

 

結束

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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM