简单的计算器
来源:互联网 发布:淘宝没有品牌授权 编辑:程序博客网 时间:2024/06/05 18:56
要想做一个简单的计算器得先明白计算器是如何计算的:
答案很简单,就是通过后缀表达式计算结果。
下面就是本人自己看了资料后写的封装类,可以把计算式转成后缀表达式,然后再计算结果并返回
package com.xhy.calculator;/** * Created by change100 on 2016/5/18. */import android.util.Log;import java.text.DecimalFormat;import java.util.ArrayList;import java.util.List;import java.util.Stack;/** * Created by change100 on 2016/5/17. */public class HouZhui { private String[] s; public HouZhui(String expressionStrs) { String s1 = getS(expressionStrs); s = getHouZhui(s1); } /** * 将所得字符串中的数字,字符之间用分号隔开 * * @param s * @return */ public String getS(String s) { StringBuilder sb = new StringBuilder(); char[] c = s.toCharArray(); for (int i = 0; i < c.length; i++) { if ('+' == c[i] || '-' == c[i] || '*' == c[i] || '/' == c[i]) { sb.append(";" + c[i] + ";"); } else { sb.append(c[i]); } } return sb.toString(); } /** * 返回计算的结果 * * @return */ public String getJiSuan() { return jisuan(); } /** * 匹配s1,s2的优先级 * * @param s1 * @param s2 * @return */ public boolean comparePrior(String s1, String s2) { if (s1.equals("*") || s1.equals("/")) { return true; } else { if (s2.equals("+") || s2.equals("-")) { return true; } } return false; } /** * 得到后缀式 * * @param expressionStrs * @return */ public String[] getHouZhui(String expressionStrs) { String[] s = expressionStrs.split(";"); List<String> lts = new ArrayList<>(); Stack<String> st = new Stack<String>(); boolean bl = true; for (int i = 0; i < s.length; i++) { if ("+".equals(s[i]) || "-".equals(s[i]) || "*".equals(s[i]) || "/".equals(s[i])) { bl = true; while (!st.isEmpty() && bl == true) { String pop = st.pop(); if (comparePrior(pop, s[i])) { lts.add(pop); } else { st.push(pop); bl = false; } } st.push(s[i]); } else { lts.add(s[i]); } } while (!st.isEmpty()) { String pop = st.pop(); lts.add(pop); } return lts.toArray(new String[0]); } /** * 判断是否为数字,是数字则返回true * * @param s * @return */ public boolean pdShu(String s) { if ("+".equals(s) || "-".equals(s) || "*".equals(s) || "/".equals(s)) { return false; } return true; } /** * 根据后缀式计算结果 * * @return */ public String jisuan() { String b; try { String[] hz = s; Stack<String> st = new Stack<String>(); Double n1, n2; // #表示没有的部分用空表示,0表示用0填 DecimalFormat decimalFormat = new DecimalFormat("#.########"); String str; for (int i = 0; i < hz.length; i++) { if (pdShu(hz[i])) { st.add(hz[i]); } else { if ("+".equals(hz[i])) { n1 = Double.parseDouble(st.pop()); n2 = Double.parseDouble(st.pop()); str = String.valueOf(n2 + n1); st.add(str); } else if ("-".equals(hz[i])) { n1 = Double.parseDouble(st.pop()); n2 = Double.parseDouble(st.pop()); str = String.valueOf(n2 - n1); st.add(str); } else if ("*".equals(hz[i])) { n1 = Double.parseDouble(st.pop()); n2 = Double.parseDouble(st.pop()); str = String.valueOf(n2 * n1); st.add(str); } else if ("/".equals(hz[i])) { n1 = Double.parseDouble(st.pop()); n2 = Double.parseDouble(st.pop()); str = String.valueOf(n2 / n1); st.add(str); } } } b = decimalFormat.format(Double.parseDouble(st.pop())); } catch (Exception e) { e.printStackTrace(); return null; } return b; }}
</pre><pre name="code" class="java">
0 0
- 简单的四则计算器
- 简单的计算器程序
- 简单的java计算器
- 简单的计算器
- 小型简单的计算器
- 一个简单的计算器
- 简单的计算器代码
- 简单的计算器制作
- 简单的计算器
- 简单的计算器
- Java 简单的计算器
- ACM简单的计算器
- 一个简单的计算器
- 简单的计算器实现
- 简单的小计算器
- 简单的整数计算器
- 简单的计算器
- 一个简单的计算器
- Oracle用sql增删改字段,并添加索引
- rhel修改ip地址的3个方法(命令修改)
- Ubuntu启动tomact问题
- python怎样压缩和解压缩ZIP文件(转)
- 中兴通讯加入LoRa Alliance董事会 推动中国运营级LoRa产业链发展
- 简单的计算器
- Springmvc 与 MyBatis的整合(三)mapper
- 在Activity中使用LocalActivityManager
- HTTP协议相关
- js操作table
- requestFeature() must be called before adding content
- Android开发之asserts读取文件
- java——io流
- servlet学习day_o1