中缀表达式转后缀表达式
思路
因为我们单独操作字符串不太好操作,所以先存放到一个ArrayList集合里面去,用如下的方法转:
//将中缀表达式存放到list里面去
public static List<String> toInfixExpression(String s) {
ArrayList<String> list = new ArrayList<>();
int index = 0;
String str;
char c;
//说明为操作符,直接加入list
while (index < s.length()) {
if ((c = s.charAt(index)) < 48 || (c = s.charAt(index)) > 57) {
list.add("" + c);
index++;
} else {
str = "";
//这里判断只要下一位不为操作符,就将数字字符串进行拼接
while (index < s.length() && (c = s.charAt(index)) >= 48 && (c = s.charAt(index)) < 57) {
str += c;
index++;
}
list.add(str);
}
}
return list;
}
//中缀转后缀表达式
public static List<String> toSuffixExpression(List<String> expression){
Stack<String> s1 = new Stack<>();
ArrayList<String> s2 = new ArrayList<>();
for (String data : expression) {
//如果是数字就直接压入s2是(就直接压入s1,如果是)就把s1里面的元素都压入到s2,
// 直到发现(位置,最后(也要弹出s1
if (data.matches("\\d+")){
s2.add(data);
}else if (data.equals("(")){
s1.push(data);
}else if (data.equals(")")){
while (!s1.peek().equals("(")){
s2.add(s1.pop());
}
//最后还需要将(给弹出s1
s1.pop();
}else {
//当s1栈顶优先级大于等于入栈的数据的时候,就把栈顶数据加入到s2,
//然后继续比较,直到小于的时候加入s1
while (s1.size()!=0&&getValue(s1.peek())>=getValue(data)){
s2.add(s1.pop());
}
//最后将小于的数据加入s1,这里的思想可以仿照
s1.push(data);
}
}
//遍历完之后,把s1剩余的数据依次加入s2即可
while (s1.size()!=0){
s2.add(s1.pop());
}
return s2;
}
这个就是中缀转后缀表达式的代码~
最后大家自己测试一下就可以了~
欢迎大家在评论区讨论~