android简单的计算器
所使用的算法:表达式求值(中缀表达式转后缀表达式,后缀表达式求值值)
不如何设计接口,有时间来美化!
MainActivity.java
package com.example.calculator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { String mid=null; TextView textView=null; //操作符栈 static LinkedList<String> opStack=new LinkedList<String>(); //优先级映射 static Map<String, Integer> priority=new HashMap<String, Integer>(){ { put("(", 0); put(")", 0); put("+", 1); put("-", 1); put("×", 2); put("÷",2); } }; public void init(){ textView=(TextView) findViewById(R.id.textView); textView.setTextSize(30); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } public void delete(View view){ String text = (String) textView.getText(); if(text!=null&&text.length()!=0){ text=text.substring(0, text.length()-1); textView.setText(text); } } public void clear(View view){ textView.setText(""); } public void showText(View view){ Button bt=(Button)view; String s = (String) bt.getText(); //Toast.makeText(this, s, Toast.LENGTH_LONG).show(); String text = (String) textView.getText(); textView.setText(text+s); } public void calc(View view){ mid = (String) textView.getText(); String[] midSplit=goToSplit(mid); Double ans=0.; try { List<String> after = midToAfter(midSplit); ans = afterValue(after); textView.setText(ans.toString()); } catch (Exception e) { Toast.makeText(this, "输入不合法,请检查", Toast.LENGTH_LONG).show(); } } public String[] goToSplit(String s){ int pre=-1;//上一个符号的位置,当两个符号一起时:)* 应分成:*# 否则分成:#*# StringBuffer sb=new StringBuffer(); for(int i=0;i<s.length();i++){ if(s.charAt(i)!='.'&&(s.charAt(i)<'0'||s.charAt(i)>'9')){ if(i-1==pre){ //上一个也是操作符号 sb.append(s.charAt(i)+"#"); } else sb.append("#"+s.charAt(i)+"#"); pre=i;//更新pre }else{ sb.append(s.charAt(i)); } } String[] split = sb.toString().split("#"); return split; } /** * 中缀转后缀: * 从左到右扫描表达式 * a:若是数字直接输出 * b:若是(直接入栈 * c:若是)将栈中操作符依次退栈输出,直到遇到(为止,将(出栈丢弃 * d其它:将当前操作符的优先级小于等于栈顶操作符优先级,则将栈顶操作出栈输出。直到不小于或栈空为止;将当前操作符入栈 */ public static List<String> midToAfter(String [] mid) throws Exception{ LinkedList<String> after=new LinkedList<String>(); int index=0; for(String ss:mid){ if(ss.equals("=")) continue; if(priority.get(ss)==null){//说明是操作数 after.add(ss); }else if(ss.equals("(")){ opStack.push(ss); }else if(ss.equals(")")){ while(!opStack.peek().equals("(")){//不是“(”,则输出, after.add(opStack.pop()); } opStack.pop();//去除( }else { while(!opStack.isEmpty()&&priority.get(ss)<=priority.get(opStack.peek())){ after.add(opStack.pop()); } opStack.push(ss); } } while(!opStack.isEmpty()) after.add(opStack.pop()); return after; } /** * 后缀求值:从左到右扫描后缀表达式 * a:若为数字,直接入栈 * b:若为操作符,从栈中出栈两个数字,按操作符计算,再把结果入栈,注意两个操作数运算顺序 * 结果:最后栈中仅仅有一个数字,出栈即为答案 * @param after * @return */ public static double afterValue(List<String> after) throws Exception{ LinkedList<Double> number=new LinkedList<Double>(); for(String ss:after){ if(priority.get(ss)!=null){//是操作符,取出两个数。按操作符计算后入数字栈 Double y=number.pop(); Double x=number.pop(); if(ss.equals("+")) number.push(x+y); else if(ss.equals("-")) number.push(x-y); else if(ss.equals("×")) number.push(x*y); else if(ss.equals("÷")) number.push(x/y); }else{ number.push(Double.valueOf(ss)); } } return number.pop(); } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="vertical" > <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="100dp" android:hint="0" /> <TableLayout android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:layout_width="60dp" android:layout_height="60dp" android:text="(" android:onClick="showText" /> <Button android:layout_width="60dp" android:layout_height="60dp" android:text=")" android:onClick="showText" /> <Button android:layout_width="60dp" android:layout_height="60dp" android:text="C" android:onClick="clear" /> <Button android:layout_width="60dp" android:layout_height="60dp" android:text="DEL" android:onClick="delete" /> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:layout_width="60dp" android:layout_height="60dp" android:text="7" android:onClick="showText" /> <Button android:layout_width="60dp" android:layout_height="60dp" android:text="8" android:onClick="showText" /> <Button android:layout_width="60dp" android:layout_height="60dp" android:text="9" android:onClick="showText" /> <Button android:layout_width="60dp" android:layout_height="60dp" android:text="÷" android:onClick="showText" /> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:layout_width="60dp" android:layout_height="60dp" android:text="4" android:onClick="showText" /> <Button android:layout_width="60dp" android:layout_height="60dp" android:text="5" android:onClick="showText" /> <Button android:layout_width="60dp" android:layout_height="60dp" android:text="6" android:onClick="showText" /> <Button android:layout_width="60dp" android:layout_height="60dp" android:text="×" android:onClick="showText" /> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:layout_width="60dp" android:layout_height="60dp" android:text="1" android:onClick="showText" /> <Button android:layout_width="60dp" android:layout_height="60dp" android:text="2" android:onClick="showText" /> <Button android:layout_width="60dp" android:layout_height="60dp" android:text="3" android:onClick="showText" /> <Button android:layout_width="60dp" android:layout_height="60dp" android:text="-" android:onClick="showText" /> </TableRow> <TableRow android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:layout_width="60dp" android:layout_height="60dp" android:text="." android:onClick="showText" /> <Button android:layout_width="60dp" android:layout_height="60dp" android:text="0" android:onClick="showText" /> <Button android:layout_width="60dp" android:layout_height="60dp" android:text="=" android:onClick="calc" /> <Button android:layout_width="60dp" android:layout_height="60dp" android:text="+" android:onClick="showText" /> </TableRow> </TableLayout> </LinearLayout>
效果图:
版权声明:本文博客原创文章,博客,未经同意,不得转载。