所使用的算法:表达式求值(中缀表达式转后缀表达式,后缀表达式求值值)

不如何设计接口,有时间来美化!

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>


效果图:




版权声明:本文博客原创文章,博客,未经同意,不得转载。

更多相关文章

  1. Android中 View not attached to window manager错误的解决办法
  2. Android中使用SQLiteDatabase对数据库进行操作
  3. Android(安卓)闹钟 开发过程记录(七)
  4. Android(安卓)开发Tips 之 Bmob操作
  5. android 读取doc文档
  6. Android(安卓)studio 将字符串写入本地的操作
  7. Android中实现输入图片地址浏览图片操作
  8. android handler操作线程的两种方式
  9. Android(安卓)数据库SQLite的使用简单Demo

随机推荐

  1. 我常用的 Android(安卓)软件
  2. android 各种常用,不易记的dialog,对话框
  3. Android(安卓)ActionBar与Menu - 1 - api
  4. [011] 百度地图API之POI搜索-发现你身边
  5. php运行原理、混编方式、常用数据类型
  6. Android中的动画详析-kotlin的demo
  7. 基于线程池和NIO技术构建高效的多协议And
  8. Android(安卓)优化OTA包大小和开机启动时
  9. android UI进阶之用gallery实现可滑动的T
  10. Android(安卓)分享两个你学习android 平