题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
输入格式
输入:后缀表达式
输出格式
输出:表达式的值
注意
String.split()函数进行分割时有些符号需要转义。
题解
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String []s = br.readLine().split("\\."); // 转义利用句号进行分割
char [][]rpn = new char[s.length][];
for(int i=0;i<s.length;i++) { // 将分割的多段字符串存在二维字符数组里,一行对应上面一段字符
rpn[i] = s[i].toCharArray();
}
// for(int i=0;i<rpn.length;i++) {
// for(int j=0;j<rpn[i].length;j++) {
// System.out.print(rpn[i][j]+" ");
// }
// System.out.println();
// }
Stack<Integer> number = new Stack<>(); // 创建堆栈放入操作数
int a,b;
int count,sum =0 ;
for(int i=0;i<rpn.length;i++) {
for(int j=0;j<rpn[i].length;j++) {
if(rpn[i][j]=='@') {
break;
}
if(rpn[i][j]=='+') {
a = number.pop();
b = number.pop();
number.push(b+a);
}else if(rpn[i][j]=='-') {
a = number.pop();
b = number.pop();
number.push(b-a);
}else if(rpn[i][j]=='*') {
a = number.pop();
b = number.pop();
number.push(b*a);
}else if(rpn[i][j]=='/') {
a = number.pop();
b = number.pop();
number.push(b/a);
}else {
count = rpn[i].length-j-1; // 判断是几位数并进行处理后加入堆栈
if(count>0) {
sum += (int)(rpn[i][j]-48)*Math.pow(10, count--);
}else {
sum += (int)(rpn[i][j]-48);
number.push(sum);
// System.out.println("加入操作数"+sum);
sum = 0;
}
}
}
}
System.out.println(number.pop());
}
}