后缀表达式(逆波兰)对于我们来说不太友好,但是对于机器来说是十分的友好的,不用管符号之间的优先级,没有括号,只要碰到符号就可以运算,下面是我写的一个逆波兰代码,可能写的有点菜
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
public int solve (String s) {
// write code here
// 获取逆波兰表达式(本来应该是String,这里就不将他转成String了)
ArrayList<String> polish = inToPost(s);
Stack<Integer> nums = new Stack<>();
// 由于已经转化成了逆波兰,所以运算规则:
// 1.遇到了数字,压入数字栈,
// 2.遇到了符号,需要两个数字出栈做该符号的运算,然后将结果压回数字栈
// 3.循环1、2步,直到item遍历完成,此时数字栈一定只剩一个数,这个数就是最终结果
for (String item : polish) {
if (item.matches("\\d+")) {
nums.push(Integer.valueOf(item));
} else {
int b = nums.pop();
int a = nums.pop();
int res = 0;
switch (item) {
case "+":
res = a + b;
break;
case "-":
res = a - b;
break;
case "*":
res = a * b;
break;
case "/":
res = a / b;
}
nums.push(res);
}
}
return nums.pop();
}
// 中缀表达式转后缀表达式:
// * 1.碰到数字直接入中间结果
// * 2.碰到“(”直接入栈
// * 3.碰到“)”将所有的符号出栈直到碰到“(”
// * 4.其他普通符号判断优先级,如果优先级大于栈顶符号直接入栈,如果小于或等于栈顶富豪的优先级直接先出栈然后再压栈
// * 5.重复上述步骤直到字符串最末尾的一个字符
// * 6.将符号栈中剩下的符号加入到中间结果中产生最终结果。
private ArrayList<String> inToPost(String s) {
ArrayList<String> items = toArray(s);
ArrayList<String> polish = new ArrayList<>();
Stack<String> signs = new Stack<>();
for (String item : items) {
if (item.matches("\\d+")) {
polish.add(item);
} else if (item.equals("(")) {
signs.push(item);
} else if (item.equals(")")) {
while (!signs.peek().equals("(")) {
polish.add(signs.pop());
}
signs.pop();
} else {
while (!signs.empty() && getPriority(signs.peek()) >= getPriority(item)) {
polish.add(signs.pop());
}
signs.push(item);
}
}
while (!signs.empty()) {
polish.add(signs.pop());
}
return polish;
}
//返回符号优先级:括号最低,+-其次,*/最高
private int getPriority(String sign) {
switch(sign) {
case "(" :
case ")" :
return 0;
case "+" :
case "-" :
return 1;
default:
return 2;
}
}
//将数字和符号拆成一个个单元,按顺序保存
private ArrayList<String> toArray(String s) {
ArrayList<String> items = new ArrayList<>();
char[] cs = s.toCharArray();
for (int i = 0; i < cs.length; i ++) {
if (cs[i] >= 48 && cs[i] <= 57) {
StringBuffer temp = new StringBuffer();
while (i + 1 < cs.length && cs[i + 1] >= 48 && cs[i + 1] <= 57) {
temp.append(cs[i]);
i++;
}
temp.append(cs[i]);
items.add(temp.toString());
} else {
items.add("" + cs[i]);
}
}
return items;
}
}
京公网安备 11010502036488号