java 字符串"a+b/(b*d)" 怎么获取a,b,c,d的值 然后按照这个计算公式计算呢
没有明白你的具体意思,估计是表达式求值吧。如果是表达式求值,明显使用堆栈。
建立一个堆栈
将包括括号以及运算符号的所有ASCII码依次按规则压入堆栈
规则如下:
从右向左依次开始压入,碰到字符和运算符和")"不管,当碰到"("时,弹栈直到弹出第一个'")",然后将弹出的内容求值,继续依照上述规则压栈。
一直压栈直到最左边的元素时,弹栈,求值。
如果你是要从"a+b*((e+(c-d)*f)/h)"这个字符串里求值,可以用相关字符串操作函数,比如strcompare()等函数等,获取到a,b……的ASCII码,
比如c++6的库函数里有一个strtok()函数,可以设定一个标志字符,本例里可以设置
char* source = "a+b*((e+(c-d)*f)/h)";
char* delimes = "+";
char* resoult = null;
执行函数 resoult = strtok(delimes,source) 即可用resoult返回第一个“+”以前的所有字符,而此时source里将保留剩下的字符,可以再次定义一个delimes获取其他字符。
然后将返回的各字符ASCII码转换为整形数即可。ASCII码转整形只相差一个常数,如果不记得,可以用a-"0"计算得出。
你的式子还算简单,都是单个字母的变量,如果变量名较长,可能还需要用到模式匹配算法等。
转化后的后缀表达式为:abcde/+*+
具体分析:
1、初始化一空栈,用来对符号进出栈使用。
2、第一个字符是a,输出,后面是符号“+”,进栈。输出的为a。
3、第三个字符是b,输出,后面是符号“*”,进栈。输出的为ab。
4、 第五个字符是“(”,依然是符号,因其只是左括号,还未配对,故进栈。输出的为ab。
5、第六个字符是c,输出,后面是符号“+”,进栈。输出的为abc。
6、第八个字符是d,输出,后面是符号“/”,进栈。输出的为abcd。
7、后面是字符e,输出,之后是“)”配对完成。进栈输出的为abcde。
8、栈顶元素“(”出栈,“/”出栈,“+”出栈,“(”出栈,括号配对完成。
9、之后也是依次出栈,最后结果为:abcde/+*+。
扩展资料:
后缀表达式进行计算的通用做法:
可以先建立一个栈S 。从左到右读表达式,如果读到操作数就将它压入栈S中,如果读到n元运算符(即需要参数个数为n的运算符)则取出由栈顶向下的n项按操作符运算,再将运算的结果代替原栈顶的n项,压入栈S中 。如果后缀表达式未读完,则重复上面过程,最后输出栈顶的数值则为结束。
后缀表达式:也叫逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。
实际意义:
1、当有操作符时就计算,因此,表达式并不是从右至左整体计算而是每次由中心向外计算一部分,这样在复杂运算中就很少导致操作符错误。
2、堆栈自动记录中间结果,这就是为什么逆波兰计算器能容易对任意复杂的表达式求值。与普通科学计算器不同,它对表达式的复杂性没有限制。
3、逆波兰表达式中不需要括号,用户只需按照表达式顺序求值,让堆栈自动记录中间结果;同样的,也不需要指定操作符的优先级。
4、逆波兰计算器中,没有“等号”键用于开始计算。
5、逆波兰计算器需要“确认”键用于区分两个相邻的操作数。
6、机器状态永远是一个堆栈状态,堆栈里是需要运算的操作数,栈内不会有操作符。
7、教育意义上,逆波兰计算器的使用者必须懂得要计算的表达式的含义。
参考资料来源:百度百科-后缀表达式
一楼的答案有多准确???
abcd只能是个位数??
假设abcd分别是1,11,111,1111呢??
========================================
用正则表达式获取4个整数,然后计算
public int calc(String str){
Pattern ppp=Pattern.compile("\\d");
Matcher mmm=ppp.matcher(str);
int[] aa=new int[4];
for(int i=0;mmm.find();i++){
aa[i]=Integer.valueOf(mmm.group());
}
return aa[0]+aa[1]/(aa[2]*aa[3]);
}
或者。。
======================================
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleBindings;
public class Test {
public static void main(String[] args) {
ScriptEngineManager sem = new ScriptEngineManager();
// 添加上下文绑定数据
SimpleBindings bindings = new SimpleBindings();
bindings.put("aaa", 1);
bindings.put("bbb", 2);
ScriptEngine engine = sem.getEngineByExtension("js");
engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
try {
Object res = engine.eval("aaa+bbb");
System.out.println(res);
String script = "function sum(a,b){ return a+b;}";
engine.eval(script);
Invocable inv = (Invocable) engine;
Object obj = inv.invokeFunction("sum", 1, 2);
System.out.println(obj);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
先将a+b/(b*d) 这个字符串里面的a,b,c,d强行转换成int型
String str = "a+b/(b*d)";
int a = Integer.parseInt(str.charAt(0)+"");
int b = Integer.parseInt(str.charAt(2)+"");
int c = Integer.parseInt(str.charAt(5)+"");
int d = Integer.parseInt(str.charAt(7)+"");
double sum = a+b/(b*d);
一楼给出的答案是正确的,先将a+b/(b*d) 这个字符串里面的a,b,c,d强行转换成int型,再进行数学运算.
薛有复方: 左边的两个变量用加号这个字符串连接起来 在控制台输入的就会是a+b,右边就是直接运算a+b了,控制台上会直接显示a+b的和;
山阳县18335159250: 在JAVA里 int a=3; int b=4 system.outprintln("a+b="+(a+b)) 中各个“+”是什么意思啊? - ?
薛有复方: 在“”里面的都是原样输出的,就是输出a+b,第2个 + 是连接的意思,就是把a+b的值放到原样输出表达式的后面,第3个 + 就是加法的意思. 例如:System.out.println(“a”+“b”)结果: ab
山阳县18335159250: Java语言,括号里的字符串"a="+a+" b"+b是什么意思呢?: - ?
薛有复方: a=a+b;//a=11 b=a-b;//b=5 a=a-b;//a=6 都是把右边的表达式的值赋值给左边的变量."a="+a+" b"+b 双引号中的原样输出,+表示接着输出变量的值.
山阳县18335159250: java中"a="+a+",b="+b+",sum="+sum怎么解释 - ?
薛有复方: 第一个"a="指的是字符串,也就是说在屏幕里面打印一句出来"a=",后面的a就是a的数值.中间的加号就是连接字符串的意思.两个连到一块就是a=它的值.我给你具体一点. {int a=3;int b=4;int sum=a+b;System.out.println("a="+a);...
山阳县18335159250: 在java里面怎样实现两个字符串的连接操作?
薛有复方: 1.String a = "abc"; String b ="def"; String c = a+b; 2.StringBuffer a =new StringBuffer("acb"); StringBuffer b =new StringBuffer("123"); a.append(b); 3.String a = "abc"; String b ="def"; String c = a.concat(b); 第三种方法,必须是String 类型
山阳县18335159250: java中,String s = "a" + "b" + "c" + "d" + "e"; 问此语句共创建了几个对象 - ?
薛有复方: 一共9个对象 java中String 每个引号都是一个对象 这就是5个了 "a"+"b"=ab一个 "ab"+"c"=abc "abc"+"d"=abcd "abcd"+"e"=abcde 这又是4个一共有9个虽然s只是指向最后一个 但是实际上产生了9个对象
山阳县18335159250: 在java里,System.out.println(“a+b=”+(a+b)):这个中间的加号有什么 - ?
薛有复方: 在System.out.println中输出多个字符串之间或字符串和变量之间,需用 ' + ' 来连接.这就是'+'的作用.
山阳县18335159250: 在java中 String a = "ab"; String b = "a" + "b"; System.out.println(a==b); 的内存图解是怎样的??
薛有复方: 栈中一个a,字符串常量池中一个"ab".a指向"ab". 栈中一个b,b指向字符串常量池的"ab". "a" + "b"这个会有一个运算的过程,现在jdk1.5以后在编译器有个优化,会自动吧+替换成StringBuilder的append,运算之后会把“ab”的引用返给b.然后“a”,"b"会被回收.
山阳县18335159250: java中的字符串相加 - ?
薛有复方: 首先你要搞清楚的是字符串用==比较,是比较两个字符串是不是指向同一个对象. 程序在运行的时候会创建一个字符串缓冲池,程序会把字符串常量(如程序中的"a","b","ab","a"+"b")放入字符串缓冲池中(这里"ab","a"+"b...
山阳县18335159250: java中的“+”怎么用? - ?
薛有复方: 按顺序,a+b+s+c是a与b先加,即两个整数相加,再加s是与字符串加,所以就变为字符串了(字符串与任何相加都是字符串),最后的+c就变为字符串相加. "the output is"+x+y,同理.用字符串与任何相加,都是一个拼串的过程.