中缀表达式转后缀并求解计算

本文介绍了如何将中缀表达式转换为后缀表达式,并详细阐述了转换过程。通过实例展示了中缀表达式"1+((2+3)×4)-5"转换为后缀表达式"1 2 3 + 4 × + 5 –"的步骤。同时,文章还解析了后缀表达式的计算方法,通过逐步计算后缀表达式"3 4 + 5 × 6 -"来求解表达式的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中缀表达式转换为后缀表达式

具体步骤如下:

  1. 初始化两个栈:运算符栈s1和储存中间结果的栈s2;
  2. 从左至右扫描中缀表达式;
  3. 遇到操作数时,将其压s2;
  4. 遇到运算符时,比较其与s1栈顶运算符的优先级:
    4.1 如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
    4.2否则,若优先级比栈顶运算符的高,也将运算符压入s1;
    4.3否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较;
  5. 遇到括号时:
    5.1 如果是左括号“(”,则直接压入s1
    5.2如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃
  6. 重复步骤2至5,直到表达式的最右边
  7. 将s1中剩余的运算符依次弹出并压入s2
  8. 依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式

举例:

将中缀表达式“1+((2+3)×4)-5”转换为后缀表达式的过程如下
在这里插入图片描述
因此结果为
“1 2 3 + 4 × + 5 –”

代码实现:

方法:将 中缀表达式转成对应的List
String:“1+((2+3)×4)-5” 转成 -》 ArrayList: [1,+,(,(,2,+,3,),*,4,),-,5]

public static List<String> toInfixExpressionList(String s) {
   
   
		//定义一个List,存放中缀表达式 对应的内容
		List<String> ls = new ArrayList<String>();
		int i = 0; //这时是一个指针,用于遍历 中缀表达式字符串
		String str; // 对多位数的拼接
		char c; // 每遍历到一个字符,就放入到c
		do {
   
   
			//如果c是一个非数字,我需要加入到ls
			if((c=s.charAt(i)) < 48 ||  (c=s.charAt(i)) > 57) {
   
   
				ls.add("" + c);
				i++; //i需要后移
			} else {
   
    //如果是一个数,需要考虑多位数
				str = ""; //先将str 置成"" '0'[48]->'9'[57]
				while(i < s.length() && (c=s.charAt(i)) >= 48 && (c=s.charAt(i)) <= 57) {
   
   
					str += c;//拼接
					i++;
				}
				ls.add(str);
			}
		}while(i < s.length());
		return ls;//返回
	}

方法:将得到的中缀表达式对应的List => 后缀表达式对应的List
ArrayList: [1,+,(,(,2,+,3,),*,4,),-,5]

ArrayList:[1,2,3,+,4,*,+,5,-]

 //即 ArrayList [1,+,(,(,2,+,3,),*,4,),-,5]  =》 ArrayList [1,2,3,+,4,*,+,5,–]
    //方法:将得到的中缀表达式对应的List => 后缀表达式对应的List
    public static List<String> parseSuffixExpreesionList(List<String> ls) {
   
   
        //定义两个栈
        Stack<String> s1 = new Stack<String>(); // 符号栈
        //说明:因为s2 这个栈,在整个转换过程中,没有pop操作,而且后面我们还需要逆序输出
        //因此比较麻烦,这里我们就不用 Stack<String> 直接使用 List<String> s2
        //Stack<String> s2 = new Stack<String>(); // 储存中间结果的栈s2
        List<String> s2 = new ArrayList<String>(); // 储存中间结果的Lists2
        //遍历ls
        for(String item: ls) {
   
   
            //如果是一个数,加入s2
            if(item.matches("\\d+")) {
   
   
                s2.add(item);
            } else if (item.equals("(")) {
   
   
                s1.push