package day8;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class expression {
public static void main(String[] args) {
String expression = "1+((2+3)*4)-5";
List<String> res = ToArrayList(expression);
System.out.println(res);
System.out.println("将中缀表达式转换为后缀");
List<String> houzhuilist = houzhuilist(res);
System.out.println(houzhuilist);
}
//----------------------------将中缀表达式字符串转换为ArrayList---------------------------------
public static List<String> ToArrayList(String s){
//思路:首先要遍历字符串(i),如果是字符直接加入list。如果是数字(多位数)要先拼接(str="")然后加入list
// 最后返回list
int i =0; //遍历
ArrayList<String> list = new ArrayList<>(); //创建数组存放转换后的字符串
String Str="";
char c;
while (i<s.length()){ //s=1+((2+3)*4)-5
// 判断为非数字
if (s.charAt(i)<48 ||s.charAt(i)>57){ //或 48-57----->0-9
list.add(s.charAt(i)+""); //s.charat为char,加入“”就转换为了字符串
i++; //向后移
}
else {
// c为数字
Str=""; //置为空
if (s.charAt(i)>48&&s.charAt(i)<57){
Str+=s.charAt(i); //将数字拼接
i++; //后移
}
list.add(Str);
}
}
return list;
}
//-------------------------------------将中缀表达式list转换成后缀表达式的list--------------------
public static List<String> houzhuilist(List<String> ls){
// 定义两个栈
Stack<String> stack1 = new Stack<String>(); //符号栈
// 说明:stack2在转换过程中没有pop,所以用数组代替 Arraylist
// Stack<String> stack2 = new Stack<String>(); //存放中间结果的栈
ArrayList<String> list2 = new ArrayList<>();
// 遍历ls
for (String item:ls){
// 如果是一个数就加入string
if (item.matches("\\d+")){
list2.add(item);
}else if (item.equals("(")){
stack1.push("(");
}else if (item.equals(")")){
while (!stack1.peek().equals("(")){
list2.add(stack1.pop());
}
stack1.pop();//将这个小括号弹出
}else {
// 判断栈顶的运算符的优先级大于等于item(从字符串取出的运算符)的优先级
while (stack1.size()!=0 && operation.getvalue(stack1.peek()) >=operation.getvalue(item)){
list2.add(stack1.pop());
}
// 还需要将item压入栈中
stack1.push(item);
}
}
while (stack1.size()!=0){
list2.add(stack1.pop());
}
return list2;
}
}
class operation {
private static int ADD = 1;
private static int SUB = 1;
private static int MUL = 2;
private static int DIV = 2;
// 写一个方法,返回优先级的数字
public static int getvalue(String oper) {
int result = 0;
switch (oper) {
case "+":
result = 1;
break;
case "-":
result = 1;
break;
case "*":
result = 2;
break;
case "/":
result = 2;
break;
default:
System.out.println("不存在改运算符");
break;
}
return result;
}
}
中缀表达式转后缀表达式
最新推荐文章于 2022-08-25 16:40:17 发布