java递归下降计算四则运算_现有一四则运算表达式,仅包含+-*/()和0~9数字,请设计一个算法,计算该表达式的值。...

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.math.BigDecimal;

import java.util.ArrayList;

import java.util.Iterator;

import

java.util.List;

/**

* 实现字符串输入之后的四则运算

* @author Administrator

*

*/

public class Math {

public static void

main(String[] args) throws IOException {

BufferedReader br = new

BufferedReader(new InputStreamReader(System.in));

resultShow(br);

//  System.out.println(9-7*8);

//  System.out.println(getResult("9-7*8"));

}

public static void resultShow(BufferedReader br) throws

IOException{

System.out.print("请输入计算式:");

//开始接受用户指令

String str = br.readLine();

try {

double result = getResult(str);

if((double)0 == result -

(int)result){

System.out.println("计算后得出的结果为:"+(int)result);

}else{

System.out.println("计算后得出的结果为:"+result);

}

} catch (Exception e) {

// TODO Auto-generated catch

block

e.printStackTrace();

System.out.println("您输入的公式不正确!请重新输入");

resultShow(br);

}

}

/**

*

首先将计算式转换为Object数组,数字转为int,符号为String

* @param expr

*

@return

*/

public static double getResult(String expr){

//转换char数组

char[] cs = expr.toCharArray();

//转换后存放公式内容的容器

ListintData = new

ArrayList();

//这个对象用来存放一串连续数字的char字符

List temp = new ArrayList();

for (int i = 0; i = 0 && (i==cs.length-1 ||

((int)cs[i+1] - 48  temp){

String

s = "";

for (Iterator i = temp.iterator();

i.hasNext();) {

Character character = (Character) i.next();

s += character;

}

return

Double.parseDouble(s);

}

public static double

getActualResult(Object[] cs){

return kuohaoMath(cs);

}

/**

* 带括号计算,使用递归

*/

public static  double

kuohaoMath(Object[] cs){

//找到扩号符的索引,正反括号

int[]

indexe敏感词indKuohaoIndex(cs);

if(indexes != null){

Object[] temp = new Object[indexes[1]-indexes[0]-1];

//截获括号里面的内容数组

for (int i = 0; i  tempData = new ArrayList();

for (int i = 0; i =0; j--) {

if(cs[j].equals("(")){

indexes[0] = j;

break;

}

}

break;

}

}

return indexes;

}

/**

* 不包括括号运算的,普通运算算法

*/

public static double

normalMath(Object[] cs){

int index = -1;

//先乘法或除法,找到*,/的索引位置

index = findMultiplication(cs);

if(index >= 0){

List tempData = new

ArrayList();

//计算符号附近相邻值得结果

double result

= 0;

if(cs[index].equals("*")){

result =

(Double)cs[index-1] *  (Double)cs[index+1];

}else{

result = (Double)cs[index-1] / (Double)cs[index+1];

}

//添加到新容器

for (int i = 0; i = 0){

List tempData = new

ArrayList();

//计算符号附近相邻值得结果

double result

= 0;

if(cs[index].equals("+")){

result =

(Double)cs[index-1] +  (Double)cs[index+1];

}else{

result =  (Double)cs[index-1] -  (Double)cs[index+1];

}

for (int i = 0; i

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值