代码

MainActivity.java

package com.example.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class MainActivity extends AppCompatActivity {

    TextView tvinput;
    String inputstr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvinput = (TextView) this.findViewById(R.id.tvinput);
        inputstr = "";
        tvinput.setText(inputstr);
    }

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn1:
                inputstr += "1";
                break;
            case R.id.btn2:
                inputstr += "2";
                break;
            case R.id.btn3:
                inputstr += "3";
                break;
            case R.id.btn4:
                inputstr += "4";
                break;
            case R.id.btn5:
                inputstr += "5";
                break;
            case R.id.btn6:
                inputstr += "6";
                break;
            case R.id.btn7:
                inputstr += "7";
                break;
            case R.id.btn8:
                inputstr += "8";
                break;
            case R.id.btn9:
                inputstr += "9";
                break;
            case R.id.btnkl:
                inputstr += "(";
                break;
            case R.id.btnkr:
                inputstr += ")";
                break;
            case R.id.btn0:
                inputstr += "0";
                break;
            case R.id.btndiv:
                inputstr += "/";
                break;
            case R.id.btnmul:
                inputstr += "*";
                break;
            case R.id.btnmin:
                inputstr += "-";
                break;
            case R.id.btnplus:
                inputstr += "+";
                break;
            case R.id.btnequal:

                String tempstr = "";
                inputstr += "=";
                try {
                    inputstr = (String) inputstr.subSequence(0, inputstr.length() - 1);
                    List<String> infixList = ToInfixExpressionList(inputstr);
                    List<String> suffixList = parseSuffixExpressionList(infixList);
                    tempstr = String.valueOf(calculate(suffixList));

                } catch (Exception e) {
                    Toast.makeText(this, "输入数据不合法", Toast.LENGTH_LONG).show();
                    e.printStackTrace();
                } finally {
                    inputstr += "=";
                    inputstr += tempstr;
                }

                break;
            case R.id.btndot:
                inputstr += ".";
                break;
            case R.id.btnclear:
                inputstr = "";
                break;
            case R.id.btnbackspace:
                if (!inputstr.isEmpty())
                    inputstr = (String) inputstr.subSequence(0, inputstr.length() - 1);
                break;
            case R.id.btnexit:
                System.exit(0);
                break;

        }
        tvinput.setText(inputstr);
    }

    public static List<String> ToInfixExpressionList(String expression) {
        expression = expression.replaceAll("\\s+", "");
        int index = 0;
        char c;
        int len = expression.length();
        String str;
        List<String> list = new ArrayList<>();
        do {
            c = expression.charAt(index);
            if ((c + "").matches("\\d+")) {
                str = "";
                while (index < len && ((c = expression.charAt(index)) + "").matches("\\d+")) {
                    str += c;
                    index++;
                }
                list.add(str);
            } else {
                list.add("" + c);
                index++;
            }
        } while (index < len);
        return list;
    }

    public static List<String> parseSuffixExpressionList(List<String> infixList) {
        Stack<String> stack = new Stack<>();
        List<String> list = new ArrayList<>();
        for (String s : infixList) {
            if (s.matches("\\d+"))
                list.add(s);
            else if (s.equals("("))
                stack.push(s);
            else if (s.equals(")")) {
                while (!stack.peek().equals("("))
                    list.add(stack.pop());
                stack.pop();
            } else {
                while (stack.size() != 0 && operation(s) <= operation(stack.peek())) {
                    list.add(stack.pop());
                }
                stack.push(s);
            }
        }
        while (stack.size() != 0)
            list.add(stack.pop());

        return list;
    }

    public static float calculate(List<String> list) {
        Stack<Float> stack = new Stack<>();
        for (String s : list) {
            if (s.matches("\\d+"))
                stack.push(Float.valueOf(s));
            else {
                float num2 = stack.pop();
                float num1 = stack.pop();
                switch (s) {
                    case "+":
                        stack.push(num1 + num2);
                        break;
                    case "-":
                        stack.push(num1 - num2);
                        break;
                    case "*":
                        stack.push(num1 * num2);
                        break;
                    case "/":
                        stack.push(num1 / num2);
                        break;
                    default:
                        break;
                }
            }
        }
        return stack.pop();
    }

    public static int operation(String s) {
        switch (s) {
            case "+":
            case "-":
                return 1;
            case "*":
            case "/":
                return 2;
            case "(":
                return 0;
            default:
                throw new RuntimeException(s + "不是运算符,请重新输入!");
        }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:id="@+id/lv"
        android:layout_width="411dp"
        android:layout_height="731dp"
        android:orientation="vertical"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="1dp">

        <LinearLayout
            android:id="@+id/lh1"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/tvinput"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:text="TextView"
                android:textAlignment="center"
                android:textColor="#040303"
                android:textSize="24sp"
                android:textStyle="bold"
                android:translationY="15px" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/lh2"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:orientation="horizontal">

            <Button
                android:id="@+id/btnclear"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.5"
                android:onClick="onClick"
                android:text="CLEAR" />

            <Button
                android:id="@+id/btnbackspace"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.5"
                android:onClick="onClick"
                android:text="BACKSPACE" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/lh3"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:orientation="horizontal">

            <Button
                android:id="@+id/btn7"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="7" />

            <Button
                android:id="@+id/btn8"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="8" />

            <Button
                android:id="@+id/btn9"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="9" />

            <Button
                android:id="@+id/btndiv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="/" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/lh4"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:orientation="horizontal">

            <Button
                android:id="@+id/btn4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="4" />

            <Button
                android:id="@+id/btn5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="5" />

            <Button
                android:id="@+id/btn6"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="6" />

            <Button
                android:id="@+id/btnmul"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="*" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/lh5"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:orientation="horizontal">

            <Button
                android:id="@+id/btn1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="1" />

            <Button
                android:id="@+id/btn2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="2" />

            <Button
                android:id="@+id/btn3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="3" />

            <Button
                android:id="@+id/btnmin"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="-" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/lh6"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:orientation="horizontal">

            <Button
                android:id="@+id/btndot"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="." />

            <Button
                android:id="@+id/btn0"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="0" />

            <Button
                android:id="@+id/btnequal"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="=" />

            <Button
                android:id="@+id/btnplus"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="+" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/lh7"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:orientation="horizontal">

            <Button
                android:id="@+id/btnkl"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text="(" />

            <Button
                android:id="@+id/btnkr"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.25"
                android:onClick="onClick"
                android:text=")" />

            <Button
                android:id="@+id/btnexit"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.5"
                android:onClick="onClick"
                android:text="EXIT" />

        </LinearLayout>

    </LinearLayout>
</android.support.constraint.ConstraintLayout>