题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int pre=-1; //一组数字的第一个
boolean n_o=false; //false为前一个是数,true为前一个是符号
//当该字符为-号且前一个为字符时为true,意味着当前这个符号是下一个数的符号
int f=0; //当前要存入的数为负;
ArrayList<String> arr= new ArrayList<>();
for (int i = 0;i < s.length(); i++) {
if(Character.isDigit(s.charAt(i))&&pre==-1){
pre=i;
}
else if (Character.isDigit(s.charAt(i))) {
continue;
}else {
//创建多位数
if(pre>=0){
String temp=f==1?"-":"";
for (int j = pre; j <i; j++) {
temp+=s.charAt(j);
}
arr.add(temp);
n_o=false;
f=0;
}
if(n_o&&s.charAt(i)=='-') f=1;
else {
if(s.charAt(i)=='{'||s.charAt(i)=='[') {
arr.add("(");
n_o = true;
}
else if(s.charAt(i)=='}'||s.charAt(i)==']')
arr.add(")");
else
arr.add(""+s.charAt(i));
pre=-1;
}
}
}
//当最后元素为数字时:
if(pre>=0){
String temp=f==1?"-":"";
for (int j = pre; j <s.length(); j++) {
temp+=s.charAt(j);
}
arr.add(temp);
}
// arr.forEach(s1-> System.out.print(s1+" "));
ArrayList<String> post=inToPost(arr);
// System.out.println(" ");
// post.forEach(s2-> System.out.print(s2+" "));
// System.out.println(" ");
System.out.println(cal(post));
}
public static ArrayList<String> inToPost(ArrayList<String> s){
HashMap<String,Integer> hm =new HashMap<>();
hm.put("+",1);
hm.put("-",1);
hm.put("*",2);
hm.put("/",2);
Stack<String> op= new Stack<>();
ArrayList<String> post =new ArrayList<>();
for (int i = 0; i < s.size(); i++) {
if(s.get(i).length()==1){ //为字符或者为个位数
if(isNumeric(s.get(i))){
post.add(s.get(i)); //一位数的数,入后缀
}else {
if(s.get(i).equals("(")){
op.push(s.get(i)); //入op栈
}else if(s.get(i).equals(")")){
String temp=""; //遇到),弹出op内运算符并加入后缀表达式,直到弹出"("为止
while (!op.isEmpty() &&!(temp=op.pop()).equals("(")){
post.add(temp);
}
}else { //遇到op,弹出栈中高于或等于当前op优先级的所有运算符,加入post,
//直到遇到"("或栈空
//并添加至op
String temp2 = "";
while (!op.isEmpty() && !(temp2 = op.peek()).equals("(")) { //任何一个为false 都停止
if (hm.get(s.get(i)) > hm.get(temp2))//当前的优先级大于op顶部的优先级
break;
post.add(op.pop());
}
op.push(s.get(i));
}
}
}else { //两位,一定为数字
post.add(s.get(i));
}
}
while (!op.isEmpty()){
post.add(op.pop());
}
return post;
}
public static boolean isNumeric(String s){
boolean flag=true;
for (int i = 0; i < s.length(); i++) {
if(!Character.isDigit(s.charAt(i)))
flag=false;
}
return flag;
}
public static int cal(ArrayList<String> s){
Stack<Integer> num=new Stack<>();
for (int i = 0; i < s.size(); i++) {
if(s.get(i).length()>1||isNumeric(s.get(i))) //大于1的均为多位数或者为负数
num.push(Integer.valueOf(s.get(i)));
else {
int num2 = num.pop();
int num1 = num.pop();
String op = s.get(i);
int res = 0;
switch (op) {
case "+":
res = num1 + num2;
break;
case "-":
res = num1 - num2;
break;
case "*":
res = num1 * num2;
break;
case "/":
res = num1 / num2;
break;
default:
break;
}
num.push(res);
}
}
return num.pop();
}
}
