首頁(yè) 收藏 QQ群
 網(wǎng)站導(dǎo)航

ZNDS智能電視網(wǎng) 推薦當(dāng)貝市場(chǎng)

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計(jì)算器

綜合交流 / 評(píng)測(cè) / 活動(dòng)區(qū)

交流區(qū) | 測(cè)硬件 | 網(wǎng)站活動(dòng) | Z幣中心

新手入門 / 進(jìn)階 / 社區(qū)互助

新手 | 你問(wèn)我答 | 免費(fèi)刷機(jī)救磚 | ROM固件

查看: 12577|回復(fù): 0
上一主題 下一主題
[教程]

【轉(zhuǎn)】[Android]使用Stack實(shí)現(xiàn)簡(jiǎn)易計(jì)算器

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:30 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
0正文   
  1. private TextView mNumberText;   
        /** 格式化數(shù)據(jù) */   
        private static final DecimalFormat mFormat = new DecimalFormat(   
                "###############.######");   
        /** 堆棧 */   
        private Stack<String> mMathStack = new Stack<String>();   
       
        /** 操作數(shù) 入棧 */   
        private void push(char obj) {   
            final int size = mMathStack.size();   
            // 清除   
            if (c == obj) {   
                mMathStack.clear();   
                mNumberText.setText("0");   
                return;   
            }   
       
            // 操作符號(hào)   
            if (+ == obj || - == obj || * == obj || / == obj || = == obj) {   
                switch (size) {   
                case 0:   
                    break;   
                case 2:   
                    if (= != obj)   
                        mMathStack.set(1, obj + "");// 同時(shí)輸入兩個(gè)操作符,后面的操作符替換前面的   
                    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;   
        }   
       
        /** 解析文本數(shù)據(jù) */   
        private double parseDouble(String str) {   
            try {   
                return Double.parseDouble(str);   
            } catch (NumberFormatException e) {   
                return 0.0D;   
            }   
        }   
       
        /** 點(diǎn)擊事件 */   
        @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:// 符號(hào),正負(fù)數(shù)   
                push(f);   
                break;   
            case R.id.btnDel:// <- delete   
                push(d);   
                break;   
            }   
        }
復(fù)制代碼
代碼說(shuō)明:                a).        R.id這些全是界面上的按鈕, 分別代表加減乘除、0-9等。                b).        基本原理:利用堆棧模型,一個(gè)操作數(shù) + 一個(gè)操作符 + 一個(gè)操作數(shù) 完成一次運(yùn)算,清空棧,把結(jié)果壓入棧底。                c).        最大支持小數(shù)點(diǎn)前15位和后6位,大家可以調(diào)整一下,只是注意不要溢出了。                d).        UI和代碼就不提供下載了,需要的也可以簡(jiǎn)單的封裝一下成一個(gè)工具類。   
        堆棧模型也很好擴(kuò)展支持其他的運(yùn)算符,對(duì)于簡(jiǎn)單運(yùn)算實(shí)現(xiàn)起來(lái)很方便,簡(jiǎn)單測(cè)試了一下沒(méi)有問(wèn)題,有問(wèn)題歡迎指正  :)   

上一篇:顯示一個(gè)模態(tài)對(duì)話框,帶yes/no按鈕
下一篇:Android程序查詢包含“*" "#”的號(hào)碼時(shí)出錯(cuò)的解決辦法

本版積分規(guī)則

Archiver|新帖|標(biāo)簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號(hào) )

網(wǎng)絡(luò)信息服務(wù)信用承諾書 | 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號(hào)

GMT+8, 2024-11-12 16:11 , Processed in 0.065121 second(s), 16 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報(bào):report#znds.com (請(qǐng)將#替換為@)

© 2007-2024 ZNDS.Com

快速回復(fù) 返回頂部 返回列表