標籤:android blog http io ar os java sp for
所用演算法:運算式計算(中綴式運算式轉尾碼運算式,尾碼運算式求值)
介面沒怎麼設計,有時間再美化!
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);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}@Overridepublic 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();}}
activity_main.xml
<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>
:
android簡單計算機