java,目标是控制台实现带不含小括号的加减乘除除运算,麻烦大触帮窝看下代码

22:15 提问
java,目标是控制台实现带括号的加减乘除运算
新手求教!麻烦大触帮我看下代码,多谢~
第4次改(依旧错
package com.
import java.io.*;
import java.util.regex.*;
public class calculator {
public static StringBuilder first(StringBuilder s){
while(s.indexOf("(")!=-1){
a=s.lastIndexOf(")");
b=s.indexOf(")",a);
s.replace(0,b+1,second(new StringBuilder(s.substring(a+1,b))).toString());
public static StringBuilder second(StringBuilder s){
Pattern pile("[-+*/]");
String[] st=p.split(s.toString());
char[] stll=new char[s.length()];
for(int i=0;i&s.length();i++){
if(s.charAt(i)=='*') stll[j++]='*';
else if(s.charAt(i)=='/') stll[j++]='/';
else if(s.charAt(i)=='+') stll[j++]='+';
else if(s.charAt(i)=='-') stll[j++]='-';
char[] st1=new char[j];
System.arraycopy(stll,0,st1,0,j);
String[] str=new String[st.length];
if(st1[0]=='*'){
str[x]=String.valueOf(Double.parseDouble(st[0])*Double.parseDouble(st[1]));
st[1]=str[x];
else if(st1[0]=='/'){
str[x]=String.valueOf(Double.parseDouble(st[0])/Double.parseDouble(st[1]));
st[1]=str[x];
else if(st1[0]=='+'){
str[x]=st[0];
str[++x]="+";
str[++x]=st[1];
else if(st1[0]=='-'){
str[x]=st[0];
str[++x]="-";
str[++x]=st[1];
for(int i=1;i&st1.i++){
if(st1[i]=='*'){
str[++x]=String.valueOf(Double.parseDouble(st[j])*Double.parseDouble(st[++j]));
st[j]=str[x];
}else if(st1[i]=='/'){
str[++x]=String.valueOf(Double.parseDouble(st[j])*Double.parseDouble(st[++j]));
st[j]=str[x];
}else if(st1[i]=='+'){
str[++x]="+";
str[++x]=st[++j];
}else if(st1[i]=='-'){
str[++x]="-";
str[++x]=st[++j];
StringBuilder ss=new StringBuilder();
for(int i=0;i&=x;i++){
ss.append(str[x]);
if(ss.indexOf("+")!=-1||ss.indexOf("-")!=-1){
ss=third(ss);
public static StringBuilder third(StringBuilder s){
Pattern pile("[+-]");
String[] st=p.split(s.toString());
for(int i=0;i&s.length();i++){
if(s.charAt(i)=='+'){
st[j]=String.valueOf(Double.parseDouble(st[j-1])+Double.parseDouble(st[j]));
else if(s.charAt(i)=='-'){
st[j]=String.valueOf(Double.parseDouble(st[j-1])-Double.parseDouble(st[j]));
return new StringBuilder(st[j].trim());
public static void main(String[] args) {
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String s=in.readLine();
StringBuilder ss=new StringBuilder(s);
if(ss.indexOf("(")!=-1) ss=first(ss);
else if(ss.indexOf("*")!=-1||ss.indexOf("/")!=-1) ss=second(ss);
else ss=third(ss);
System.out.println("="+ss);
}catch(NumberFormatException e){
System.err.println("NumberFormatException");
e.printStackTrace();
}catch(ArrayIndexOutOfBoundsException e){
System.err.println("ArrayIndexOutOfBoundsException");
e.printStackTrace();
}catch (IOException e) {
System.err.println("IOException");
e.printStackTrace();
}catch(Exception e){
System.err.println("Exception");
e.printStackTrace();
加减运算没问题,第二优先级1步运算没问题,2步开始出错:
ArrayIndexOutOfBoundsException
java.lang.ArrayIndexOutOfBoundsException: 3
at com.calculator.calculator.second(calculator.java:50)
at com.calculator.calculator.main(calculator.java:94)
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.AbstractStringBuilder.substring(Unknown Source)
at java.lang.StringBuilder.substring(Unknown Source)
at com.calculator.calculator.first(calculator.java:10)
at com.calculator.calculator.main(calculator.java:93)
按赞数排序
我写的 貌似可以用 12*-10+(9*9+2+(8/3-2)) 这样的可以算出来 在复杂一点就难说了
import java.util.ArrayL
import java.util.A
import java.util.L
import java.util.S
import java.util.regex.M
import java.util.regex.P
public class Calculator {
public static void main(String[] args) {
Pattern pattern = pile("(?&=\d)(\+|-|\*|/)");
Matcher matcher = pattern.matcher("2-4");//3*((5*(2-4))*(3-1*2))
while(matcher.find()){
System.out.println(matcher.group());
double rs = 0;
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
rs=count(str);
System.out.println(rs);
public static double count(String str){
Pattern p1 = pile("\([^\(^\)]*\)");
Matcher m1 = p1.matcher(str);
if(m1.find()){
if(m1.start()==0&&m1.end()==str.length()){
if(str.startsWith("(")&&str.endsWith(")")){
str = str.substring(1,str.length()-1);
double rs = 0;
Pattern pattern = pile("\([^\(^\)]*\)");
Matcher matcher = pattern.matcher(str);
while(matcher.find()){//计算最里面的一对括号们
String str2 = matcher.group();
rs = count(str2);
str = str.replace(str2,String.valueOf(rs));
while(str.indexOf("(")&-1){//算完以后还有括号继续优先算
Matcher matcher2 = pattern.matcher(str);
while(matcher2.find()){
String str2 = matcher2.group();
rs = count(str2);
str = str.replace(str2,String.valueOf(rs));
rs = count2(str);
private static double count2(String str) {
if(str.startsWith("(")&&str.endsWith(")")){
str = str.substring(1,str.length()-1);
double rs = 0;
String[] nums = str.split("(?&=\d)(\+|-|\*|/)");
String[] ctrls = str.replaceAll("[0-9.]|(?&!\d)(\+|-|\*|/)", "").split("");
List numsList = new ArrayList();
List ctrlsList = new ArrayList();
for (String string : nums) {
numsList.add(string);
for (String string : ctrls) {
ctrlsList.add(string);
for (int i = 1; i & ctrlsList.size(); i++) {
if("*".equals(ctrlsList.get(i))||"/".equals(ctrlsList.get(i))){
double start = Double.parseDouble(numsList.get(i-1));
double end = Double.parseDouble(numsList.get(i));
if("*".equals(ctrlsList.get(i))){
rs = start*
rs = start/
ctrlsList.remove(i);
numsList.remove(i);
numsList.set(i-1, String.valueOf(rs));
for (int i = 1; i & ctrlsList.size(); i++) {
if("+".equals(ctrlsList.get(i))||"-".equals(ctrlsList.get(i))){
double start = Double.parseDouble(numsList.get(i-1));
double end = Double.parseDouble(numsList.get(i));
if("+".equals(ctrlsList.get(i))){
rs = start+
rs = start-
ctrlsList.remove(i);
numsList.remove(i);
numsList.set(i-1, String.valueOf(rs));
你可以去了解一下后缀表达式
你看报错,写着空指针表达式文本长度,未知来源,你的测试数据对么
split方法用得不对,分隔符太多了,不能分隔成数组。
试用一下,中序表达式算法
其他相似问题java中怎么将字符串(带运算符号加减乘除)转换成代数算式运算-中国学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
> 信息中心 >
java中怎么将字符串(带运算符号加减乘除)转换成代数算式运算
来源:互联网 发表时间: 15:31:35 责任编辑:鲁晓倩字体:
为了帮助网友解决“java中怎么将字符串(带运算符号加减乘除)转换成代数算式运算”相关的问题,中国学网通过互联网对“java中怎么将字符串(带运算符号加减乘除)转换成代数算式运算”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:java中怎么将字符串(带运算符号加减乘除)转换成代数算式运算,具体解决方案如下:解决方案1:
ublic static void main(String[] args) { ScriptEngine se = new ScriptEngineManager(); } catch (ScriptException e) {JavaScript& String str = &5+9+9%5&quot.getEngineByName(&.out.printStackTrace().println(d); try { Double d = (Double)2*3-45/ System.eval(str);)
解决方案2:
java是无法直接解决,不要试图在这方面想了,但是javaScript中有一个eval函数是可以执行的,所以,可以通过其他途径执行javaScript就可以做到,而ScriptEngine是java的一个javaScript实现类 ,可以完成操作,稍有难度!
解决方案3:
返回。没有转第六步,转第五步。没有括号转第三步,有加减号。1、表达式没有乘除号。6、把乘除号和乘除号前后的数字提取出来。返回,然后计算结果,如果有括号、判断表达式中有没有括号,判断表达式是乘号还是除号、提取数字和符号,这里只是描述了带括号和加减乘除的表达式,得到新的表达式、提取包含加减的表达式中的符号和数据,则根据运算符优先级处理、判断表达式中有没有乘号和除号。转第三步3。就是这个道理、把括号内的内容提取出来,转第二步。2这需要写很长一段代码,如果有更多的运算符。7。5,有转第四步,计算结果,作为一个新的表达式。转第七步。4
相关文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 中国学网 版权所有
京ICP备号-1 京公网安备02号扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
麻烦帮我找五道有理数加减乘除混合运算(一道题里要带上大括号中括号小括号!自己写的也行,但要比较好算!
有才の潥漞
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
/view/cd0afc84b9d528ea81c77944.html/view/5d476bef5ef7ba0d4a733bd1.html
为您推荐:
其他类似问题
扫描下载二维码}

我要回帖

更多关于 先乘除后加减括号 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信