题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String s = in.next();
if(!isLeft(s.charAt(0))){
s="("+s+")";//方便计算,计算方式极度依赖 ')'
}
Deque<String> numStk =new ArrayDeque<>();
Deque<Character> flagStk =new ArrayDeque<>();
for(int i=0;i<s.length();i++){
char cc =s.charAt(i);
if(isNum(cc)){//数字,取数,入数栈
int endIndex =getFullNumEndIndex(s,i);
String num =s.substring(i,endIndex+1);
//负数处理,题目不明确,这里只有(-1 这种形式的处理, 可能还有 *-1、/-1 未考虑
if(i-2>0 && '-'==s.charAt(i-1) && isLeft(s.charAt(i-2))){
flagStk.removeFirst();
num="-"+num;
}
numStk.addFirst(num);
i=endIndex;
continue;
}
if(isAdd(cc) || isMul(cc) || isLeft(cc)){//符号入符号栈
flagStk.addFirst(cc);
continue;
}
//剩下的情况就是右括号了,匹配到右括号不入栈,而是弹栈一直到左括号为止
String num="0";
while(!isLeft(flagStk.getFirst())){
char flag =flagStk.removeFirst();
if(isMul(flag)){
String n2=numStk.removeFirst();
String n1=numStk.removeFirst();
numStk.addFirst(compute(n1,flag,n2));
}else{
String n2=numStk.removeFirst();
num=compute(num,flag,n2);
}
}
flagStk.removeFirst();
numStk.addFirst(compute(numStk.removeFirst(),'+',num));
}
System.out.println(numStk.removeFirst());
}
}
public static String compute(String n1,char flag,String n2){
switch(flag){
case '+' :
return String.valueOf(Integer.valueOf(n1)+Integer.valueOf(n2));
case '-' :
return String.valueOf(Integer.valueOf(n1)-Integer.valueOf(n2));
case '*' :
return String.valueOf(Integer.valueOf(n1)*Integer.valueOf(n2));
case '/' :
return String.valueOf(Integer.valueOf(n1)/Integer.valueOf(n2));
default :
return "0";
}
}
public static boolean isNum(char cc) {
return cc>='0' && cc<='9';
}
public static boolean isAdd(char cc) {
return cc=='+' || cc =='-';
}
public static boolean isMul(char cc) {
return cc=='*' || cc =='/';
}
public static boolean isLeft(char cc) {
String left="([{";
return left.contains(cc+"");
}
public static boolean isRight(char cc) {
String right=")]}";
return right.contains(cc+"");
}
public static int getFullNumEndIndex(String s,int fstNumIndex){
if(fstNumIndex+1==s.length())
return fstNumIndex;
while(fstNumIndex<s.length() && isNum(s.charAt(fstNumIndex+1))){
fstNumIndex++;
}
return fstNumIndex;
}
}
三奇智元机器人科技有限公司公司福利 130人发布