import java.math.BigDecimal;
import java.math.RoundingMode;
import PushAndPop.NumStack;
import PushAndPop.Symbol;
import PushAndPop.SymbolStack;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class CalculateActivity extends Activity {
private Button xAdd;
private Button xSub;
private Button xMult;
private Button xDivid;
private Button xCalculate;
private Button xClear;
private Button xPoint;
private EditText xedit;
private Button x1;
private Button x2;
private Button x3;
private Button x4;
private Button x5;
private Button x6;
private Button x7;
private Button x8;
private Button x9;
private Button x0;
private Button xClearAll;
NumStack numStack1;//数据栈1
SymbolStack symbolStack1;//符号栈1
NumStack numStack2;//数据栈2
SymbolStack symbolStack2;//符号栈;
private enum Flag {num, add, sub, mult, divid, empty, zero, point};//标志位
boolean flagPoint = false; //小数点标志位
boolean flagCalculate = false;//计算一次清一次零
char[] calculateR;
boolean flagCalculatePoint = false;
int dianwei;
//当前操作的标志位
private Flag flag=Flag.empty;
private String get;//获取Edittext当前内容
private BigDecimal result;//计算结果
private String sresult;//字符串结果
//使用SharedPreferences 来储存与读取数据
SharedPreferences mShared = null;
public final static String SHARED_MAIN = "main";
public final static String KEY_RESULT = "result";
String init;//上一次的计算结果
public void PushAndPop(String s){//使用两个栈实现队列形式存放数据和符号
char[] mass = s.toCharArray();
//System.out.println(mass.length);
String n = new String("");
numStack1 = new NumStack();
symbolStack1 = new SymbolStack();
numStack2 = new NumStack();
symbolStack2 = new SymbolStack();
for(int j = 0;j < mass.length;j++){
//把数字和小数点连成一个数字
if(Character.isDigit(mass[j])||mass[j]==46){
n = n + mass[j];
}
else{//如果是符号的话,就把之前的数字压进栈中
if(n.length() != 0){
numStack1.push(n);
n = new String("");//清 空
}
symbolStack1.push(mass[j]);//压符号
}
if(j == mass.length-1 && n.length()!=0){//压最后一个数据
numStack1.push(n);
n = new String("");
}
}
//实现队列形式
while(numStack1.countNum()>0)
numStack2.push(numStack1.pop().getNum());
while(symbolStack1.countSymbol()>0)
symbolStack2.push(symbolStack1.pop().getSymbol());
}//到此为止,numStack2,symbolStack2存放的是逆序的字符
//计算结果
public BigDecimal calculator(NumStack numStack,SymbolStack symbolStack){
//当栈里剩最后一个数字时
if(numStack.countNum() == 1){
return new BigDecimal(numStack.pop().getNum());
}//当栈剩最后一个符号时
if(symbolStack.countSymbol() == 1){
BigDecimal num11 = new BigDecimal(numStack.pop().getNum());
BigDecimal num22 = new BigDecimal(numStack.pop().getNum());
Symbol symbol11 = symbolStack.pop();
char fuhao11 = symbol11.getSymbol();
switch (fuhao11) {
case '+':
BigDecimal sum11 = num11.add(num22);
return sum11;
case '-':
BigDecimal sum22 = num11.subtract(num22);
return sum22;
case '×':
BigDecimal sum33 = num11.multiply(num22);
return sum33;
case '÷':
BigDecimal sum44 = num11.divide(num22,20,RoundingMode.HALF_UP);
return sum44;
}
return new BigDecimal(0.0);
}
else{//栈里不止一个符号时
Symbol symbol1 = symbolStack.pop();
Symbol symbol2 = symbolStack.pop();
char fuhao1 = symbol1.getSymbol();
char fuhao2 = symbol2.getSymbol();
//取优先级
int symbolFlag1 = symbol1.getDegree();
int symbolFlag2 = symbol2.getDegree();
//当符号一比符号二高优先级时,直接算前两个数
if(symbolFlag1 >= symbolFlag2){
BigDecimal num1 = new BigDecimal(numStack.pop().getNum());
BigDecimal num2 = new BigDecimal(numStack.pop().getNum());
switch(fuhao1){
case '+':
BigDecimal sum = num1.add(num2);
numStack.push(sum.toString());
break;
case '-':
BigDecimal sum1 = num1.subtract(num2);
numStack.push(sum1.toString());
break;
case '×':
BigDecimal sum3 = num1.multiply(num2) ;
numStack.push(sum3.toString());
break;
case '÷':
BigDecimal sum4 = num1.divide(num2,20,RoundingMode.HALF_UP);
numStack.push(sum4.toString());
break;
}
//把符号二压回栈中,准备下一次出栈
symbolStack.push(fuhao2);
//继续调用计算方法
return calculator(numStack,symbolStack);
}
else{//当符号二优先级高于符号一时,需要从数据栈中弹出3个数,算后两个的值
//算完后要压回栈中
BigDecimal num1 = new BigDecimal(numStack.pop().getNum());
BigDecimal num2 = new BigDecimal(numStack.pop().getNum());
BigDecimal num3 = new BigDecimal(numStack.pop().getNum());
switch(fuhao2){
case '+':
BigDecimal sum = num2.add(num3);
numStack.push(sum.toString());
break;
case '-':
BigDecimal sum1 = num2.subtract(num3);
numStack.push(sum1.toString());
break;
case '×':
BigDecimal sum3 = num2.multiply(num3) ;
numStack.push(sum3.toString());
break;
case '÷':
BigDecimal sum4 = num2.divide(num3,20,RoundingMode.HALF_UP);
numStack.push(sum4.toString());
break;
}
numStack.push(num1.toString());//把数字一压回栈中
symbolStack.push(fuhao1);//把符号一压回栈中
return calculator(numStack, symbolStack);
}
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
xAdd = (Button)findViewById(R.id.Add);
xSub = (Button)findViewById(R.id.Sub);
xMult = (Button)findViewById(R.id.Mult);
xDivid = (Button)findViewById(R.id.Divid);
xedit = (EditText)findViewById(R.id.edit);
xCalculate =(Button)findViewById(R.id.Calculate);
xClear = (Button)findViewById(R.id.Clear);
xPoint = (Button)findViewById(R.id.Point);
x1 = (Button)findViewById(R.id.X1);
x2 = (Button)findViewById(R.id.X2);
x3 = (Button)findViewById(R.id.X3);
x4 = (Button)findViewById(R.id.X4);
x5 = (Button)findViewById(R.id.X5);
x6 = (Button)findViewById(R.id.X6);
x7 = (Button)findViewById(R.id.X7);
x8 = (Button)findViewById(R.id.X8);
x9 = (Button)findViewById(R.id.X9);
x0 = (Button)findViewById(R.id.X0);
xClearAll = (Button)findViewById(R.id.ClearAll);
//取得SharedPreferences
mShared = getSharedPreferences(SHARED_MAIN, this.MODE_PRIVATE);
//通过键值取的之前保存的数据,如果没有则取得默认值"没有数据记录"
String init = mShared.getString(KEY_RESULT, "没有数据记录");
xedit.setHint("上次计算结果为 :"+init);//在EditText显示上次的计算结果
xAdd.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
get = xedit.getText().toString();
if(get.isEmpty()) {//当在第一次输入时是符号是无效的
xedit.setText("");
return;
}
//连续输入操作符时 的处理
if(flag==Flag.add||flag==Flag.sub||
flag==Flag.mult||flag==Flag.divid){
get = get.substring(0, get.length() - 1);
}
xedit.setText(get + "+");
xedit.setSelection(get.length()+1);
flag = Flag.add;
flagPoint = false;//当有操作符出现后,小数点标志位复位
}
});
xSub.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
get = xedit.getText().toString();
if(get.isEmpty()) {
xedit.setText("");
return;
}
if(flag==Flag.add||flag==Flag.sub||
flag==Flag.mult||flag==Flag.divid){
get = get.substring(0, get.length() - 1);
}
xedit.setText(get + "-");
xedit.setSelection(get.length()+1);
flag = Flag.sub;
flagPoint = false;
}
});
xMult.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
get = xedit.getText().toString();
if(get.isEmpty()) {
xedit.setText("");
return;
}
if(flag==Flag.add||flag==Flag.sub||
flag==Flag.mult||flag==Flag.divid){
get = get.substring(0, get.length() - 1);
}
xedit.setText(get + "×");
xedit.setSelection(get.length()+1);
flag = Flag.mult;
flagPoint = false;
}
});
xDivid.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
get = xedit.getText().toString();
if(get.isEmpty()) {
xedit.setText("");
return;
}
if(flag==Flag.add||flag==Flag.sub||
flag==Flag.mult||flag==Flag.divid){
get = get.substring(0, get.length() - 1);
}
xedit.setText(get + "÷");
xedit.setSelection(get.length()+1);
flag = Flag.divid;
flagPoint = false;
}
});
x0.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//计算一次请一次零
if(flagCalculate == true){
xedit.setText("");
flagCalculate = false;
}
get = xedit.getText().toString();
if(get.isEmpty()) {
flag = Flag.zero;
// flagList.add(flag);
xedit.setText("0");
xedit.setSelection(1);
return;
}
if(flag == Flag.zero) {
xedit.setText(get);
xedit.setSelection(get.length());
return;
}
switch (flag) {
case add:
case sub:
case mult:
case divid:
flag = Flag.zero;
xedit.setText(get + "0");
xedit.setSelection(get.length()+1);
// flagList.add(flag);
break;
case point:
case num:
flag = Flag.num;
xedit.setText(get + "0");
xedit.setSelection(get.length()+1);
break;
case zero:
default:
break;
}
}
});
x1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(flagCalculate == true){
xedit.setText("");
flagCalculate = false;
}
get = xedit.getText().toString();
if(get.isEmpty()) {
xedit.setText("1");
xedit.setSelection(1); //(设置当前光标,此时因为get为空)
return;
}
if(flag == Flag.zero) {
get = get.substring(0, get.length() -1);//当1前面是0时,覆盖
}
xedit.setText(get+"1");
xedit.setSelection(get.length()+1); //(设置当前光标)
flag = Flag.num;//设置数字标志位
}
});
x2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(flagCalculate == true){
xedit.setText("");
flagCalculate = false;
}
get = xedit.getText().toString();
if(get.isEmpty()) {
xedit.setText("2");
xedit.setSelection(1);
return;
}
if(flag == Flag.zero) {
get = get.substring(0, get.length() - 1);
}
xedit.setText(get+"2");
xedit.setSelection(get.length()+1);
flag = Flag.num;
}
});
x3.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(flagCalculate == true){
xedit.setText("");
flagCalculate = false;
}
get = xedit.getText().toString();
if(get.isEmpty()) {
xedit.setText("3");
xedit.setSelection(1);
return;
}
if(flag == Flag.zero) {
get = get.substring(0, get.length() -1);
}
xedit.setText(get+"3");
xedit.setSelection(get.length()+1);
flag = Flag.num;
}
});
x4.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(flagCalculate == true){
xedit.setText("");
flagCalculate = false;
}
get = xedit.getText().toString();
if(get.isEmpty()) {
xedit.setText("4");
xedit.setSelection(1);
return;
}
if(flag == Flag.zero) {
get = get.substring(0, get.length() -1);
}
xedit.setText(get+"4");
xedit.setSelection(get.length()+1);
flag = Flag.num;
}
});
x5.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(flagCalculate == true){
xedit.setText("");
flagCalculate = false;
}
get = xedit.getText().toString();
if(get.isEmpty()) {
xedit.setText("5");
xedit.setSelection(1);
return;
}
if(flag == Flag.zero) {
get = get.substring(0, get.length() -1);
}
xedit.setText(get+"5");
xedit.setSelection(get.length()+1);
flag = Flag.num;
}
});
x6.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(flagCalculate == true){
xedit.setText("");
flagCalculate = false;
}
get = xedit.getText().toString();
if(get.isEmpty()) {
xedit.setText("6");
xedit.setSelection(1);
return;
}
if(flag == Flag.zero) {
get = get.substring(0, get.length() -1);
}
xedit.setText(get+"6");
xedit.setSelection(get.length()+1);
flag = Flag.num;
}
});
x7.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(flagCalculate == true){
xedit.setText("");
flagCalculate = false;
}
get = xedit.getText().toString();
if(get.isEmpty()) {
xedit.setText("7");
xedit.setSelection(1);
return;
}
if(flag == Flag.zero) {
get = get.substring(0, get.length() -1);
}
xedit.setText(get+"7");
xedit.setSelection(get.length()+1);
flag = Flag.num;
}
});
x8.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(flagCalculate == true){
xedit.setText("");
flagCalculate = false;
}
get = xedit.getText().toString();
if(get.isEmpty()) {
xedit.setText("8");
xedit.setSelection(1);
return;
}
if(flag == Flag.zero) {
get = get.substring(0, get.length() -1);
}
xedit.setText(get+"8");
xedit.setSelection(get.length()+1);
flag = Flag.num;
}
});
x9.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(flagCalculate == true){
xedit.setText("");
flagCalculate = false;
}
get = xedit.getText().toString();
if(get.isEmpty()) {
xedit.setText("9");
xedit.setSelection(1);
return;
}
if(flag == Flag.zero) {
get = get.substring(0, get.length() -1);
}
xedit.setText(get+"9");
xedit.setSelection(get.length()+1);
flag = Flag.num;
}
});
xPoint.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(flagCalculate == true){
xedit.setText("");
flagCalculate = false;
}
get = xedit.getText().toString();
if(get.isEmpty()) {
flag = Flag.point;
flagPoint = true;
xedit.setText(".");
xedit.setSelection(1);
return;
}
if(flagPoint) {
xedit.setText(get);
xedit.setSelection(get.length());
return;
}
xedit.setText(get + ".");
xedit.setSelection(get.length() + 1);
flag = Flag.point;
flagPoint = true;
}
});
//单个清除
xClear.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
get = xedit.getText().toString();
if(get.isEmpty()) return;
get = get.substring(0, get.length() - 1);
xedit.setText(get);
xedit.setSelection(get.length());//
}
});
//全清空
xClearAll.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
xedit.setText("");
flag = Flag.empty;
flagPoint = false;
}
});
xCalculate.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(flag == Flag.add||flag == Flag.divid||flag == Flag.mult||flag == Flag.sub ){
xedit.setText("不合法运算!!!");
flagCalculate = true;
// xedit.setText("");
flag = Flag.empty;
flagPoint = false;
return;
}
flagCalculate = true;
get = xedit.getText().toString();
System.out.println(get);
PushAndPop(get);//把数据押进栈里
result = calculator(numStack2,symbolStack2);
//System.out.println(result.toString());
sresult = result.toString();
calculateR = sresult.toCharArray();
for(int i = 0;i < calculateR.length;i++){
if(calculateR[i] == '.'){
dianwei = i;
System.out.println("dian:"+dianwei);
for(int j = i + 1;j<calculateR.length;j++){
if(calculateR[j] != '0'){
System.out.println(j);
flagCalculatePoint = true;
}
}
}
}
if(flagCalculatePoint){
xedit.setText(sresult);
Editor editor = mShared.edit();
editor.putString(KEY_RESULT,sresult);
//put完毕必需要commit()否则无法保存
editor.commit();
flagCalculatePoint = false;
}
else{
sresult = sresult.substring(0, dianwei);
xedit.setText(sresult);
System.out.println(sresult);
Editor editor = mShared.edit();
editor.putString(KEY_RESULT,sresult);
//put完毕必需要commit()否则无法保存
editor.commit();
}
}
});
}
}
package yy.android.PushAndPop;
public class Num {
private String s = new String();
public Num(String s1){
s = s1;
}
public String getNum(){
return s;
}
public Num next;
}
package yy.android.PushAndPop;
public class NumList {
private Num firstNum;
public NumList(){
firstNum = null;
}
public boolean isEmpty(){
return(firstNum == null);
}
public void insertFirst(String s1){
Num newNum = new Num(s1);
newNum.next = firstNum;
firstNum = newNum;
}
public Num deleteFirst(){
Num temp = firstNum;
firstNum = firstNum.next;
return temp;
}
}
package yy.android.PushAndPop;
public class NumStack {
private NumList theNumList;
private int countNum;
public NumStack(){
theNumList = new NumList();
countNum = 0;
}
public void push(String s1){
theNumList.insertFirst(s1);
countNum++;
}
public Num pop(){
countNum = countNum - 1;
return theNumList.deleteFirst();
}
public boolean isEmpty(){
return(theNumList.isEmpty());
}
public int countNum(){
return countNum;
}
}
package yy.android.PushAndPop;
public class Symbol {
private char c;
private int degree1;
public Symbol(char c1){
c = c1;
if(c == '×'||c == '÷')
degree1 = 2;
else
degree1 = 1;
}
public int getDegree(){
return degree1;
}
public char getSymbol(){
return c;
}
public Symbol next;
}
package yy.android.PushAndPop;
public class SymbolList {
private Symbol firstSymbol;
public SymbolList(){
firstSymbol = null;
}
public boolean isEmpty(){
return(firstSymbol == null);
}
public void insertFirst(char c1){
Symbol newSymbol = new Symbol(c1);
newSymbol.next = firstSymbol;
firstSymbol = newSymbol;
}
public Symbol deleteFirst(){
Symbol temp = firstSymbol;
firstSymbol = firstSymbol.next;
return temp;
}
}
package yy.android.PushAndPop;
public class SymbolStack {
private SymbolList theSymbolList;
private int countSymbol;
public SymbolStack(){
theSymbolList = new SymbolList();
countSymbol = 0;
}
public void push(char c1){
theSymbolList.insertFirst(c1);
countSymbol++;
}
public Symbol pop(){
countSymbol = countSymbol -1;
return theSymbolList.deleteFirst();
}
public boolean isEmpty(){
return(theSymbolList.isEmpty());
}
public int countSymbol(){
return countSymbol;
}
}
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, CalculateActivity!</string>
<string name="app_name">CalFMR</string>
<string name="calculate">计算器</string>
<string name="X0">0</string>
<string name="X1">1</string>
<string name="X2">2</string>
<string name="X3">3</string>
<string name="X4">4</string>
<string name="X5">5</string>
<string name="X6">6</string>
<string name="X7">7</string>
<string name="X8">8</string>
<string name="X9">9</string>
<string name="Add">+</string>
<string name="Clear">C</string>
<string name="ClearAll">ClrAll</string>
<string name="Sub">-</string>
<string name="Mult">×</string>
<string name="Point">.</string>
<string name="Divid">÷</string>
<string name="Calculate">=</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background = "#404040"
>
<EditText
android:id="@+id/edit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dip"
android:layout_marginBottom="10dip"
android:layout_marginLeft="10dip"
android:layout_marginRight="10dip"
></EditText>
<TableLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginLeft="10dip"
android:layout_marginRight="10dip"
android:stretchColumns="0,1,2,3,4"
>
<TableRow>
<TextView
android:layout_span="2"
/> <!--前两格置空 -->
<Button
android:id="@+id/Clear"
android:text="@string/Clear"
/>
<Button
android:id="@+id/ClearAll"
android:text="@string/ClearAll"
/>
</TableRow>
<TableRow>
<Button
android:id="@+id/X7"
android:text="@string/X7"
/>
<Button
android:id="@+id/X8"
android:text="@string/X8"
/>
<Button
android:id="@+id/X9"
android:text="@string/X9"
/>
<Button
android:text="@string/Add"
android:id="@+id/Add"
></Button>
</TableRow>
<TableRow>
<Button
android:text="@string/X4"
android:id="@+id/X4"
></Button>
<Button
android:text="@string/X5"
android:id="@+id/X5"
></Button>
<Button
android:text="@string/X6"
android:id="@+id/X6"
></Button>
<Button
android:text="@string/Sub"
android:id="@+id/Sub"
></Button>
</TableRow>
<TableRow>
<Button
android:id="@+id/X1"
android:text="@string/X1"
/>
<Button
android:id="@+id/X2"
android:text="@string/X2"
/>
<Button
android:id="@+id/X3"
android:text="@string/X3"
/>
<Button
android:text="@string/Mult"
android:id="@+id/Mult"
></Button>
</TableRow>
<TableRow>
<Button
android:id="@+id/Point"
android:text="@string/Point"
/>
<Button
android:id="@+id/X0"
android:text="@string/X0"
/>
<Button
android:text="@string/Divid"
android:id="@+id/Divid"
></Button>
<Button
android:text="@string/Calculate"
android:id="@+id/Calculate"
></Button>
</TableRow>
</TableLayout>
</LinearLayout>