今天刷oj,遇见一个难题,网上都是c++的解法,我写一个Java的记录一下,用栈来解决。
题目描述:
Roliygu曾经沉迷于SICP大半个学期,在沉迷期间,他对LISP语言的算术表达式很感兴趣,于是类比写出了一种后缀表达式。后缀表达式是指的将两个操作数之间的操作符移到两个操作数之后的表达式。比如原来的表达式为(1-2)*(4+5)=-9,写成后缀表达式就成了 1 2 - 4 5 + *
输入:
第一行输入n,0<n<10,表示有n行表达式
接下来的n行,每行一个后缀表达式,保证表达式合法,且不使用除四则运算之外的操作。不会输入负数
输出:
输出n行,每行为输入表达式的最终结果,结果保留两位小数,不需要高精度数。
样例输入
1
1 2 - 4 5 + *
样例输出
-9.00
import java.text.DecimalFormat;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;
import org.junit.Test;
/**
* 简单计算器
*
* @author 猴子哥哥
* @date 2019年1月11日
*/
public class Main018 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
Scanner scanner2 = new Scanner(System.in);
String[] str = new String[n];
for (int i = 0; i < n; i++) {
str[i] = scanner2.nextLine();
}
for (int i = 0; i < n; i++) {
double result = count(str[i]);
DecimalFormat df = new DecimalFormat("0.00");
System.out.println(df.format(result));
}
}
}
private static double count(String string) {
StringBuilder newstr = new StringBuilder();
double result = 0;
Deque stack = new LinkedList();
char[] arr = string.toCharArray();
for (int i = 0; i < arr.length; i++) {
if (arr[i] == ' ') {
continue;
}
if (arr[i] == '+' || arr[i] == '-' || arr[i] == '*' || arr[i] == '/') {
double A = (double) stack.pop();
double B = (double) stack.pop();
switch (arr[i]) {
case '+':
stack.push(B + A);
break;
case '-':
stack.push(B - A);
break;
case '*':
stack.push(B * A);
break;
case '/':
stack.push(B / A);
break;
}
} else {
double temp = Integer.valueOf(String.valueOf(arr[i]));
stack.push(temp);
}
}
result = (double) stack.pop();
return result;
}
@Test
public void t2() {
int num = Integer.valueOf("123456");
System.out.println(num++);
}
}