首页 > 代码库 > android简单计算器

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();
	}

}


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简单计算器