用两个栈来做,有些特殊情况需要考虑:
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());
}
}
}
} 


京公网安备 11010502036488号