题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String s = in.nextLine();
s = s.replace('[', '(');
s = s.replace('{', '(');
s = s.replace(']', ')');
s = s.replace('}', ')');
//System.out.println(s);
Deque<Integer> numbers = new LinkedList<>();
Deque<Character> operators = new LinkedList<>();
int n = s.length();
//变换表达式形式 有0的情况3+2*{1+2*[(0-4)/(8-6)+7]}
StringBuffer ss = new StringBuffer();
for (int i = 0 ; i < n ; ++i) {
if (s.charAt(i) == '-') {
if (i == 0 || s.charAt(i - 1) == '(') {
ss.append("(0-");
++i;
if (s.charAt(i) == '(') {
//这里应该再做一些处理,比如说-((3*2)-1))的情况,这里可以对括号进行计数,然后遇到最终的)才返回,但是这里用例情况没有考虑
while (s.charAt(i) != ')') {
ss.append(s.charAt(i));
++i;
}
ss.append(')');
} else {
while(i < n && s.charAt(i) >= '0' && s.charAt(i) <= '9'){
ss.append(s.charAt(i));
++i;
}
ss.append(')');
--i;
}
}
else{
ss.append('-');
}
}
else{
ss.append(s.charAt(i));
}
}
//System.out.println(ss.toString());
s = ss.toString();
n=s.length();
for (int i = 0 ; i < n ; ++i) {
StringBuffer sb = new StringBuffer();
while (i < n && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
sb.append(s.charAt(i));
++i;
//System.out.println(s.charAt(i));
}
//System.out.println(sb.toString());
if (sb.length() > 0) {
numbers.push(Integer.valueOf(sb.toString()));
}
if (i < n) {
char op = s.charAt(i);
if (op == '(') {
operators.push(op);
}
else if (op == '+' || op == '-') {
if (operators.isEmpty()) {
operators.push(op);
continue;
}
char opPeak = operators.peek();
while (!operators.isEmpty() && operators.peek() != '(') {
int a = numbers.pop();
int b = numbers.pop();
if (opPeak == '*') {
numbers.push(a * b);
}
if (opPeak == '/') {
numbers.push(b / a);
}
if (opPeak == '+') {
numbers.push(b + a);
}
if (opPeak == '-') {
numbers.push(b - a);
}
operators.pop();
if (operators.isEmpty()) {
break;
}
opPeak = operators.peek();
}
operators.push(op);
}
else if (op == '*' || op == '/') {
operators.push(op);
} else {
while (operators.peek() != '(') {
char opPeak = operators.pop();
int a = numbers.pop();
int b = numbers.pop();
//System.out.println(a+" "+b);
//System.out.println(numbers);
//System.out.println(operators);
if (opPeak == '+') {
numbers.push(a + b);
} else if (opPeak == '-') {
numbers.push(b - a);
} else if (opPeak == '*') {
numbers.push(a * b);
} else {
numbers.push(b / a);
}
}
operators.pop(); //把左括号出栈
}
}
}
while (!operators.isEmpty()) {
int a = numbers.pop();
int b = numbers.pop();
char op = operators.pop();
if (op == '+') {
numbers.push(a + b);
} else if (op == '-') {
numbers.push(b - a);
} else if (op == '*') {
numbers.push(a * b);
} else {
numbers.push(b / a);
}
}
System.out.println(numbers.peek());
}
}
}

查看16道真题和解析