处理负数运算 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
此计算器主要处理的难点在于负数和减号的区分,它通过在遇到乘号和除号后,根据下一个字符是否为'-'来判断是不是负数,并进行相应的操作,以此来实现对负数的处理。
能处理-2*-5 2*-5 -2*5 等三种带‘-’的情况
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String s = sc.nextLine();
// 将其他类型的括号替换成小括号,这样可以统一处理
s = s.replace("{", "(");
s = s.replace("[", "(");
s = s.replace("}", ")");
s = s.replace("]", ")");
// 在字符串末尾添加"+",为了处理最后一个数字
s = s + "+";
// 打印出结果
System.out.println(slove(s, 0, s.length() - 1));
}
}
public static int slove(String s, int l, int r) {
Stack<Integer> stack = new Stack<>();
char[] chs = s.toCharArray();
int fu = 1;
// 初始化操作符为'+'
char sign = '+';
// 初始化数字为0
int number = 0;
// 遍历字符串中的每个字符
for (int i = 0; i <= r; i++) {
char ch = chs[i];
// 如果当前字符是空格,则跳过
if (ch == ' ') continue;
// 如果当前字符是数字,则拼接数字
if (Character.isDigit(ch)) {
number = number * 10 + ch - '0';
}
// 对负数进行处理
number = fu * Math.abs(number) ;
// 如果当前字符是'(',说明遇到了一个子表达式
if (ch == '(') {
// 找到子表达式的右括号的位置
int j = i;
int count = 0;
for (; i < s.length(); i++) {
if (chs[i] == ')') count--;
if (chs[i] == '(') count++;
// 当遇到的左右括号数量相等时,说明找到了子表达式的右括号
if (count == 0) break;
}
// 递归处理子表达式
number = slove(s.substring(j + 1, i) + "+", 0, i - j - 1);
}
// 如果当前字符不是数字
if (!Character.isDigit(ch)) {
// 根据操作符对数字进行处理,并将结果压入栈
switch (sign) {
case '+':
stack.push(number);
fu = 1;
break;
case '-':
stack.push(-1 * number);
fu = 1;
break;
case '*':
// 处理'-'为负号的情况
if (ch == '-' && chs[i - 1] == '*') {
fu = -1;
continue;
} else {
stack.push(stack.pop() * number);
fu = 1;
}
break;
case '/':
// 处理'-'为负号的情况
if (ch == '-' && chs[i - 1] == '/') {
fu = -1;
continue;
} else if (stack.peek() != 0) {
stack.push(stack.pop() / number);
fu = 1;
}
break;
}
// 更新操作符和数字
sign = ch;
number = 0;
}
}
// 最后,把栈中的所有数字求和,就得到了最后的结果
int total = 0;
while (!stack.isEmpty()) {
total += stack.pop();
}
return total;
}
}
}
#计算器#
