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

來源:互聯網
上載者:User

 

前言

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

 

聲明  歡迎轉載,但請保留文章原始出處:)     部落格園: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和代碼就不提供下載了,需要的也可以簡單的封裝一下成一個工具類。

 

結束

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

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.