代码
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>
Q.E.D.