zoukankan      html  css  js  c++  java
  • 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>
    


    效果图:




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

  • 相关阅读:
    Reporting Services 配置工具
    管道符、重定向和环境变量
    靶机DC-2 rbash绕过+git提权
    单表查询
    数据库和表的基本操作(二)
    数据库和表的基本操作(一)
    MySQL的约束
    bugku-misc 9-16
    Linux基础命令
    时间-i春秋
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4655434.html
Copyright © 2011-2022 走看看