题目给出:本题主要是算法第四版上的一道题目
计算(1+((2+3)(45)))的值
解析:1.这道题,我们可以看到有操作数和操作符,我们可以利用两个栈来解决这个问题,一个操作数栈,一个操作符栈,分别为opertor,number。2.判断操作数出栈的条件是遇到 “)” 括号,遇到右括号就要进行操作符出栈(这里会遇到弹出的操作符不是我们想要的操作符,而是”(“ 这样我们就要将操作符栈再次出栈),对应的操作数栈相邻的两个操作数出栈,做算术表达式后进行再次入操作数栈。3.当操作数栈为空的时候,最后一次出操作数栈的就是我们计算得到的值。
直接上代码
package com.cxy.stack;
import java.util.Scanner;
import java.util.Stack;
public class ArithmeticExpression {
public static void main(String[] args){
System.out.println("请输入一串带()+数字的算术表达式:例如(1+((2+3)*(4*5)))");
Scanner scanner =new Scanner(System.in);
String input = scanner.nextLine();
System.out.println(input);
//操作符栈
Stack opertor =new Stack<>();
//操作数栈
Stack number =new Stack<>();
//保存最终数据的
double res =0;
int index =0;
int len = input.length();
while(len>0){
//index控制表达式的字符位置
len--;
//中间临时保存计算值
String tempOperator =null;
char ch = input.charAt(index);
index++;
if(ch =='+'|| ch =='-' || ch =='*' || ch =='/' || ch =='('){
//如果是操作符,
System.out.println("入操作符栈:"+ch);
opertor.push(Character.toString(ch));
}else if(ch !=')'){
System.out.println("入操作数栈:"+ch);
number.push(Double.parseDouble(Character.toString(ch)));
}else if(ch ==')'){
//遇到右括号,出操作符栈,并执行相应的number出栈
System.out.println("遇到右括号");
tempOperator = opertor.pop();
//再出一次操作符栈将(括号去掉
String leftKuo = opertor.pop();
System.out.println("遇到右括号出栈的字符:"+tempOperator);
System.out.println("将左括号去电"+leftKuo);
//出第一个number
// System.out.println("操作数右边的数:"+firstNumber);
if(tempOperator.equals("+")){
double firstNumber = number.pop();
double lastNumber = number.pop();
//计算之后将新得到的数字继续入数字栈
System.out.println("加号左边出操作数:"+lastNumber);
number.push(lastNumber+firstNumber);
System.out.println("两边相加的操作数入栈:"+lastNumber+firstNumber);
System.out.println("相加后的栈长度:"+number.size());
}else if(tempOperator.equals("-")){
//后出栈的减前面的
double firstNumber = number.pop();
number.push(number.pop()-firstNumber);
}else if(tempOperator.equals("*")){
double firstNumber = number.pop();
double lastNumber = number.pop();
System.out.println("乘号右边"+firstNumber);
System.out.println("乘号左边"+lastNumber);
number.push(lastNumber*firstNumber);
System.out.println("相乘的两边的操作数入栈:"+firstNumber*lastNumber);
System.out.println("相乘后的栈长度:"+number.size());
}else if(tempOperator.equals("/")){
double firstNumber = number.pop();
//如果分母为0,提示错误
if(firstNumber ==0){
System.out.println("分母为0,无法计算");
break;
}else
number.push(number.pop()/firstNumber);
}
}
}
System.out.println("计算结果为:"+number.pop());
}
}
最后输出结果
"C:\Program Files\Java\jdk1.8.0_162\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.4\lib\idea_rt.jar=50194:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_162\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\rt.jar;D:\IdeaWorkSpace\Algorithms\JinDianSuanFa\out\production\JinDianSuanFa;D:\mvnrep\junit\junit\4.12\junit-4.12.jar;D:\mvnrep\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.cxy.stack.Arithmetic
请输入一串带()+数字的算术表达式:例如(1+((2+3)*(4*5)))
(1+((2+3)*(4*5)))
(1+((2+3)*(4*5)))
入操作符栈:(
入操作数栈:1
入操作符栈:+
入操作符栈:(
入操作符栈:(
入操作数栈:2
入操作符栈:+
入操作数栈:3
遇到右括号
遇到右括号出栈的字符:+
将左括号去电(
加号左边出操作数:2.0
两边相加的操作数入栈:2.03.0
相加后的栈长度:2
入操作符栈:*
入操作符栈:(
入操作数栈:4
入操作符栈:*
入操作数栈:5
遇到右括号
遇到右括号出栈的字符:*
将左括号去电(
乘号右边5.0
乘号左边4.0
相乘的两边的操作数入栈:20.0
相乘后的栈长度:3
遇到右括号
遇到右括号出栈的字符:*
将左括号去电(
乘号右边20.0
乘号左边5.0
相乘的两边的操作数入栈:100.0
相乘后的栈长度:2
遇到右括号
遇到右括号出栈的字符:+
将左括号去电(
加号左边出操作数:1.0
两边相加的操作数入栈:1.0100.0
相加后的栈长度:1
计算结果为:101.0
Process finished with exit code 0
其实还有很多地方需要考虑,比如用户输入的数据进行校验,小伙伴儿们可以进行参考和修改
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1371769065@qq.com