天天看點

[Android]使用Stack實作簡易電腦

前言

花了點時間幫朋友做了一個電腦,以後可能還用得着,留下來存個檔。

聲明

  歡迎轉載,但請保留文章原始出處:) 

    部落格園:http://www.cnblogs.com

    農民伯伯: http://over140.cnblogs.com

正文

[Android]使用Stack實作簡易電腦

    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');

[Android]使用Stack實作簡易電腦

代碼說明:

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

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

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

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

結束

堆棧模型也很好擴充支援其他的運算符,對于簡單運算實作起來很友善,簡單測試了一下沒有問題,有問題歡迎指正  :)

轉載:http://www.cnblogs.com/over140/archive/2012/07/06/2579226.html

繼續閱讀