[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和代码就不提供下载了,需要的也可以简单的封装一下成一个工具类。

 

结束

堆栈模型也很好扩展支持其他的运算符,对于简单运算实现起来很方便,简单测试了一下没有问题,有问题欢迎指正  :)

转载:http://www.cnblogs.com/over140/archive/2012/07/06/2579226.html

时间: 2024-11-10 00:58:25

[Android]使用Stack实现简易计算器的相关文章

android-小菜Android初次做简易计算器,不知道问题出在哪里?

问题描述 小菜Android初次做简易计算器,不知道问题出在哪里? del和c按钮 点起来没有反应,但是就是找不出问题在哪~~求指点~~ 代码如下: package com.example.calculaterdemo; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.w

c语言简易计算器小白问题

问题描述 c语言简易计算器小白问题 #include float fun1(float a,float b) { float c; c=a+b; return c; } float fun2(float a,float b) { float c; c=a-b; return c; } float fun3(float a,float b) { float c; c=a*b; return c; } float fun4(float a,float b) { float c; c=a/b; ret

语言-用C51编写单片机程序实现10以内的加减乘除的简易计算器

问题描述 用C51编写单片机程序实现10以内的加减乘除的简易计算器 5C 运行80C51单片机C51语言编写程序,在51实验小系统上实现"十以内的简易计算器",即:定义51实验小系统上的按键分别为0-9数字键.'+'."-""*""/"'='.退格等功能键:识别相关按键,按照十以内加法的正确逻辑在数码管上显示按键对应的信息,并完成加法运算,在数码管上显示加法结果.实验内容两个层次--层次一:加法的结果在十以内:层次二:两个加数

《Android应用开发攻略》——1.15 程序:Android OS下的小费计算器Tipster

1.15 程序:Android OS下的小费计算器Tipster Sunit Katkar1.15.1 问题 当你和朋友前往饭店就餐并且希望计算各自的账单和小费时,可能陷入许多手动计算和分歧之中.你希望使用一个应用程序,简单地将小费比例加到总额上,并且按照就餐人数分配.Tipster就是Android中的一个实现,用它展示一个完整的应用程序.1.15.2 解决方案 这是一个简单的练习,使用Android中的基本GUI元素,然后用一些简单的计算和事件驱动UI代码将它们组合起来.将用到如下GUI组件

界面-java 简易计算器,最后得数不能出现,求大神帮忙

问题描述 java 简易计算器,最后得数不能出现,求大神帮忙 (1)编写一个简易计算器程序,其界面如下图所示: (2)当按下"+"按钮时,两个数值文本框之间应显示"+"号,同时相加结果显示在第三个文本框内(如下图所示).类似处理"-"."*"和"/"按钮. 现在第二步能够出现加号 就是不能正确运算.如下代码,注释的地方为什么不能运行,该怎么做才能做到当按下加的按钮b1时,同时出现加号和得数?这里的tf和tf

java代码-我用java写了一个简易计算器的程序,但是有时候结果不正确

问题描述 我用java写了一个简易计算器的程序,但是有时候结果不正确 就是有时候计算结果后面会显示很多9或者0 ,比如计算8.3-2.1时,请问大神怎么解决啊? 我是菜菜鸟,程序如下: //Calculator.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Calculator extends JFrame { private JPanel p1=new JPanel();

flex-bison简易计算器 新手问题

问题描述 bison简易计算器 新手问题 最近看了flex bison,然后这个计算器结果一直是0,为什么. 这是1.l: %{ # include "2.tab.h" %} %% "+" { return ADD; } "-" { return SUB; } "*" { return MUL; } "/" { return DIV; } "|" { return ABS; } [0-9

php问题-简易计算器错了不知怎么修改,求解答 谢谢

问题描述 简易计算器错了不知怎么修改,求解答 谢谢 请输入第一个值: 请输入第二个值: 请选择运算符:+-*/ <?php function __getresult(){ $num1=$_POST['num1']; $num2=$_POST['num2']; $operator=$_POST['operator']; $res=0; if($operator=="+"){ $res="num1+num2"; }else if (operator=="

javascript实现简易计算器的代码_javascript技巧

今天闲来无聊,想写点什么,突然想到用javascript写一个计算器.程序还存在很多的Bug,先在这里记录一下,以后慢慢更正. 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.or