仿android计算器,实现了括号详解编程语言
2023-06-13 09:20:29 时间
// 用计算出来的结果替换子表达式
exp = exp.substring(0, left) + res + exp.substring(right + 1);
// 递归计算新的表达式
exp = cal(exp);
// 格式化表达式
String newExp = formatExp(exp);
List Character opts = getOptions(newExp);
List Double nums = getNums(newExp);
// 先处理乘除
for (int i = 0; i opts.size(); i++) {
char opt = opts.get(i);
if (opt == ÷ || opt == ×) {
opts.remove(i);
double d1 = nums.remove(i);
double d2 = nums.remove(i);
if (opt == ÷) {
d1 = d1 / d2;
} else {
d1 = d1 * d2;
nums.add(i, d1);
i--;
while (!opts.isEmpty()) {
char opt = opts.remove(0);
double d1 = nums.remove(0);
double d2 = nums.remove(0);
if (opt == +) {
d1 = d1 + d2;
} else {
d1 = d1 - d2;
nums.add(0, d1);
return formatNum(nums.get(0));
/**
* 获得一个表达式中所有的运算符
* @param exp
* @return
private static List Character getOptions(String exp) {
List Character opts = new ArrayList Character
StringTokenizer st = new StringTokenizer(exp, "@.0123456789");
while (st.hasMoreTokens()) {
opts.add(st.nextToken().charAt(0));
return opts;
/**
* 获得一个表达式中所有的数字
* @param exp
* @return
private static List Double getNums(String exp) {
List Double nums = new ArrayList Double
StringTokenizer st = new StringTokenizer(exp, "+-×÷");
while (st.hasMoreTokens()) {
String num = st.nextToken();
if (num.contains("@")) {
num = "-" + num.substring(1);
nums.add(Double.parseDouble(num));
return nums;
/**
* 格式一个浮点数
* @param num
* @return
public static String formatNum(double num) {
DecimalFormat df = (DecimalFormat) NumberFormat.getInstance();
df.applyLocalizedPattern("#0.##########");
if (num 1000000000) {
df.applyPattern("#0.#######E0");
return df.format(num);
/**
* 格式化表达式
* 1.替换操作(找出负号,[email protected])
* 2.避免非法表达式的出现
private static String formatExp(String exp) {
// 如果表达式是以运算符结束的,则将最后一位运算符去除
if (exp.matches(".*[+-/×÷]")) {
exp = exp.substring(0, exp.length() - 1);
String res = exp;
if (exp.charAt(0) == -) {
res = "@" + res.substring(1);
for (int i = 1; i res.length(); i++) {
if (res.charAt(i) == - (res.charAt(i - 1) == ÷ || res.charAt(i - 1) == ×)) {
res = res.substring(0, i) + "@" + res.substring(i + 1);
return res;
/**
* 检查表达式是否有括号,并且检查是否符合
* @param exp
* @return
public static boolean checkExp(String exp) {
boolean res = true;
int index = exp.indexOf("(");
if (index != -1) {
int leftN = 0;
for (int i = index; i exp.length(); i++) {
if (exp.charAt(i) == () {
leftN++;
else if (exp.charAt(i) == )) {
leftN--;
if (leftN == -1) {
res = false;
break;
if (leftN 0) {
res = false;
return res;
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/10665.html
cjava相关文章
- 加密狗android,Android系统加密狗的设计与实现
- android 空间分享到朋友圈,Android开发之微信分享到好友,朋友圈
- android移动点餐系统内容和要求,基于Android云计算的移动点餐系统
- 【Android布局】在程序中设置android gravity 和 android layout Gravity属性
- android attrs获取_关于Android attrs 自定义属性的说明
- 原创Paper | 在 Android 中开发 eBPF 程序学习总结(二)
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)
- 【Android RenderScript】RenderScript 简介 ② ( RenderScript 引入 | RenderScript 简介 )
- 【Android Gradle 插件】SigningConfig 签名配置 ② ( keyAlias 配置 | keyPassword 配置 )
- 网购Android App购物车点击动画实现详解编程语言
- Android多线程实现文件断点下载详解编程语言
- Android获得WIFI IP地址或者手机网络IP详解编程语言
- 基于Java LinkedList,实现Android大数据缓存策略详解编程语言
- PhoneGap 搭建Android应用环境详解编程语言
- WebSocket实现android消息推送详解编程语言
- 探索Linux世界之Android厨房:DIY个性化安卓系统(linux安卓厨房)
- Android系统基于Linux内核,实现移动设备突破极限。(android linux内核)