题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
import java.util.*;
//中缀转后缀再计算
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String expression = sc.nextLine();
System.out.println(eval(expression));
}
public static int eval(String expression){
expression = expression.replace('[','(');
expression = expression.replace(']',')');
expression = expression.replace('{','(');
expression = expression.replace('}',')');
List<String> expressionList = parseToExpression(expression);
List<String> postfixExpression = castToPostfixExpression(expressionList);
return eval(postfixExpression);
}
public static int eval(List<String> postfixExpression){
Stack<String> stack = new Stack<>();
Set<String> sign = new HashSet<>();
sign.add("+");
sign.add("-");
sign.add("*");
sign.add("/");
for (int i = 0; i < postfixExpression.size(); i++) {
String s = postfixExpression.get(i);
if(sign.contains(s)){
int num2 = Integer.parseInt(stack.pop());
int num1 = Integer.parseInt(stack.pop());
switch (s){
case "+":
stack.push(String.valueOf(num1+num2));
break;
case "-":
stack.push(String.valueOf(num1-num2));
break;
case "*":
stack.push(String.valueOf(num1*num2));
break;
case "/":
stack.push(String.valueOf(num1/num2));
break;
}
}else {
stack.push(s);
}
}
return Integer.parseInt(stack.lastElement());
}
public static List<String> castToPostfixExpression(List<String> infixExpression){
Map<String,Integer> isp = new HashMap<>();
Map<String,Integer> icp = new HashMap<>();
initIspAndIcp(isp,icp);
Stack<String> stack = new Stack<>();
List<String> result = new ArrayList<>();
stack.push("#");
infixExpression.add("#");
for (int i = 0; i < infixExpression.size(); i++) {
String s = infixExpression.get(i);
if(icp.containsKey(s)){
while (icp.get(s)<=isp.get(stack.lastElement())){
if(icp.get(s)<isp.get(stack.lastElement())){
result.add(stack.pop());
}
if(icp.get(s) == isp.get(stack.lastElement())){
stack.pop();
break;
}
}
if(!s.equals(")")){
stack.push(s);
}
}else {
result.add(s);
}
}
return result;
}
public static List<String> parseToExpression(String expression){
char[] chs = expression.toCharArray();
List<String> stringList = new ArrayList<>();
List<Character> numbers = new ArrayList<>();
boolean digitFlag = false;
for (int i = 0; i < chs.length; i++) {
char temp = chs[i];
if(Character.isDigit(temp)){
if(!digitFlag){
digitFlag = true;
}
numbers.add(temp);
if(i == chs.length-1){
digitFlag = false;
StringBuilder sb = new StringBuilder();
for (int j = 0; j < numbers.size(); j++) {
sb.append(numbers.get(j));
}
stringList.add(sb.toString());
numbers.clear();
}
}else{
if(digitFlag){
digitFlag = false;
StringBuilder sb = new StringBuilder();
for (int j = 0; j < numbers.size(); j++) {
sb.append(numbers.get(j));
}
stringList.add(sb.toString());
numbers.clear();
stringList.add(String.valueOf(temp));
continue;
}
if(temp == '-'){
if((i-1>=0&&chs[i-1] == '(')||i == 0){
digitFlag = true;
numbers.add(temp);
continue ;
}
}
stringList.add(String.valueOf(temp));
}
}
return stringList;
}
public static void initIspAndIcp(Map<String,Integer> isp,Map<String,Integer> icp){
isp.put("#",0);
isp.put("(",1);
isp.put("+",3);
isp.put("-",3);
isp.put("*",5);
isp.put("/",5);
isp.put(")",6);
icp.put("#",0);
icp.put("(",6);
icp.put("+",2);
icp.put("-",2);
icp.put("*",4);
icp.put("/",4);
icp.put(")",1);
}
}
