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

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

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简单的计算器的更多相关文章

  1. Android下实现一个简单的计算器源码

    下面的内容是关于Android下实现一个简单的计算器的内容. import android.app.Activity; import android.os.Bundle;import android. ...

  2. Android 简单计算器实现源码

    1.string.xml代码 <?xml version="1.0" encoding="utf-8"?> <resources> &l ...

  3. js制作简单的计算器

    学着做了一个简单的计算器!记录记录!哈哈 <!DOCTYPE html> <html> <head> <title>简单的计算器</title&g ...

  4. 留念 C语言第一课简单的计算器制作

    留念 C语言第一课简单的计算器制作 学C语言这么久了.  /* 留念 C语言第一课简单的计算器制作 */   #include<stdio.h>  #include<stdlib.h ...

  5. jsp学习---使用jsp和JavaBean实现超简单网页计算器

    一.需求 如题,用jsp实现一个超简单的网页计算器. 二.实现 1.效果图 1)初始界面: 2)随便输入两个数进行相乘: 3)当除数为零时提示报错: 2.代码 Calculator.java pack ...

  6. JS实现一个简单的计算器

    使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除.效果如上: 第一步: 创建构建运算函数count(). 第二步: 获取两个输入框中的值和获取选择 ...

  7. javascript 简单的计算器

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...

  8. 教学项目之-通过Python实现简单的计算器

    教学项目之-通过Python实现简单的计算器   计算器开发需求 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/ ...

  9. HDU1237 简单的计算器 【堆】+【逆波兰式】

    简单的计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

随机推荐

  1. 5次Shift会触发粘滞键的妙用(转)

    1.前提 你可以在平时亲身接触状态电脑,哪怕是在电脑主人不在的时候(虽然主人不在,或者关机了,进入电脑是要密码的). 2.原理 利用电脑连续按5次Shift会触发粘滞键,它会运行c:\winows\s ...

  2. Net 一个请求的处理流程

    Net 一个请求的处理流程   1.浏览器请求 请求-准备环境-->处理请求   2.Aspnet 环境的创建 客户请求 IIS区分静态文件还是动态文件,静态文件直接文件返回,动态文件通过asp ...

  3. js中不同的height, top的对比

    每次看到js中的clientHeight(clientTop), offsetHeight(offsetTop),scrollHeight(scrollTop)就头大,根本分不清这几种的区别,然而碰到 ...

  4. 《JAVA与模式》之单例模式 [转]

    在阎宏博士的<JAVA与模式>一书中开头是这样描述单例模式的: 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的 ...

  5. suggest的使用方法

    suggest的使用方法注意: 1. 要表示汉语的"建议做某事",英语通经常使用suggest doing sth,而不能用 suggest to do sth: 2. " ...

  6. zoj 3210 A Stack or A Queue? (数据结构水题)

     A Stack or A Queue? Time Limit: 1 Second      Memory Limit: 32768 KB Do you know stack and queue? ...

  7. c++的vector容器

    c++还有一个很常用的容器就是vector容器,他是数组实现的,是一种可变长的容器,在很多的时候可以简化我们的编程.可学习的链接:http://www.cnblogs.com/mr-wid/archi ...

  8. Delegate,Action,Func,Predicate的使用与区别

    C#4.0推出后,类似Linq,Lamda表达式等许多新的程序写法层次不穷.与之相关的Delegate,Action,Func,Predicate的使用和区别也常常让大家迷惑,此处就结合实际的应用,对 ...

  9. MVC中实现多按钮提交(转)

    有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...

  10. 为代码减负之&lt;一&gt;触发器(SQL)

    对触发器一词早有耳闻(最早是在耿大妈的数据库视频中),当初看完视频后,对理解不深刻的东西如:触发器,存储过程,事务,日志等等没有具体的去查阅,也没有具体的去尝试,应用.所以才导致了今天的博客(把曾经丢 ...