用两个栈来做,有些特殊情况需要考虑:
1、+, -, *, / 这四个符号前面有可能会省略0,比如:(-4*2),应该为(0-4*2),所以要在前面加个0,但是,还有中特殊情况不需要加0,比如:(4\2)-3,这种情况,'-'前面不需要加0。综上,只有前面是'(','[','{'这三种情况的话,才需要加0;
2、有大于10的数字存在,所以需要处理10以上情况,具体看代码。
简单说下步骤:
1、新建两个栈,一个栈用来存数字,一个栈用来存运算符
2、遍历整个字符串,如果是数字,入数字栈(考虑10以上情况);如果是普通运算符(考虑省略0情况),入运算符栈;如果是左括号('(', '[', '{'),入运算符栈;如果是右括号(')', ']', '}'),见第三步。
3、如果是右括号(')', ']', '}'),需要出栈操作,出栈到与对应的左括号匹配。我是这么做的,首先新建两个栈,用来存储第一次出栈结果,在出栈的过程中,只计算乘除操作,不计算加减。出栈结束后,新建的两个栈中会存储加减,那么再出栈新建的两个栈,计算加减操作。那么这次操作就是一次括号内的结果,将结果入栈数字栈。
4、第二步和第三步都结束后,那么输入的运算式就结束了,此时有可能运算符栈仍不为空,所以需要再计算运算符栈和数字栈中的结果
代码如下:
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { String str = sc.next(); Stack<Integer> stack1 = new Stack<Integer>(); // 用来存储数字 Stack<Character> stack2 = new Stack<Character>(); // 用来存储运算符 for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (Character.isDigit(c)) { // 读取到的字符为数字 if (i > 0 && Character.isDigit(str.charAt(i - 1))) { // 考虑数字大于10的情况 stack1.push(stack1.pop() * 10 + (c - 48)); } else { stack1.push(c - 48); } } else { if (c == ')') { Stack<Integer> stack = new Stack<Integer>(); // 新建一个栈存储本次小括号内的结果 Stack<Character> option = new Stack<Character>(); // 新建一个栈存储小括号中的运算符 int count = 0; int m = stack1.pop(); char o = stack2.pop(); while (o != '(') { if (o == '*' || o == '/') { // 对于乘除,需要计算结果 int a = stack1.pop(); if (o == '*') { stack1.push(a * m); } else { stack1.push(a / m); } } else if (o == '+' || o == '-') { // 对于加减,不需要计算结果 stack.push(m); option.push(o); } m = stack1.pop(); o = stack2.pop(); } count += m; while (!option.empty()) { // 上面处理完后,再计算剩下的操作(加减) char op = option.pop(); if (op == '+') { count += stack.pop(); } else if (op == '-') { count -= stack.pop(); } } stack1.push(count); } else if (c == ']') { Stack<Integer> stack = new Stack<Integer>(); Stack<Character> option = new Stack<Character>(); int count = 0; int m = stack1.pop(); char o = stack2.pop(); while (o != '[') { if (o == '*' || o == '/') { int a = stack1.pop(); if (o == '*') { stack1.push(a * m); } else { stack1.push(a / m); } } else if (o == '+' || o == '-') { stack.push(m); option.push(o); } m = stack1.pop(); o = stack2.pop(); } count += m; while (!option.empty()) { char op = option.pop(); if (op == '+') { count += stack.pop(); } else if (op == '-') { count -= stack.pop(); } } stack1.push(count); } else if (c == '}') { Stack<Integer> stack = new Stack<Integer>(); Stack<Character> option = new Stack<Character>(); int count = 0; int m = stack1.pop(); char o = stack2.pop(); while (o != '{') { if (o == '*' || o == '/') { int a = stack1.pop(); if (o == '*') { stack1.push(a * m); } else { stack1.push(a / m); } } else if (o == '+' || o == '-') { stack.push(m); option.push(o); } m = stack1.pop(); o = stack2.pop(); } count += m; while (!option.empty()) { char op = option.pop(); if (op == '+') { count += stack.pop(); } else if (op == '-') { count -= stack.pop(); } } stack1.push(count); } else if (c == '+' || c == '-' || c == '*' || c == '/') { if (i == 0 || (!Character.isDigit(str.charAt(i - 1)) && str.charAt(i - 1) != ')' && str.charAt(i - 1) != ']' && str.charAt(i - 1) != '}')) { // 考虑省略0的情况 stack1.push(0); } stack2.push(c); } else { stack2.push(c); } } } if (!stack2.empty()) { // 有可能还未运算结束 Stack<Integer> stack = new Stack<Integer>(); Stack<Character> option = new Stack<Character>(); int count = 0; int m = stack1.pop(); char o = stack2.pop(); while (!stack1.empty()) { if (o == '*' || o == '/') { int a = stack1.pop(); if (o == '*') { stack1.push(a * m); } else { stack1.push(a / m); } } else if (o == '+' || o == '-') { stack.push(m); option.push(o); } m = stack1.pop(); if (stack2.empty()) { break; } else { o = stack2.pop(); } } count += m; do { char op = option.pop(); if (op == '+') { count += stack.pop(); } else if (op == '-') { count -= stack.pop(); } } while (!option.empty()); System.out.println(count); } else { System.out.println(stack1.pop()); } } } }