为了账号安全,请及时绑定邮箱和手机立即绑定

需要帮助使用堆栈将后缀转换为 Infix

需要帮助使用堆栈将后缀转换为 Infix

眼眸繁星 2022-09-07 16:15:35
我编写了代码,将后缀转换为完全括号的后缀,作为我家庭作业的一部分,但此代码只能将后缀表达式转换为个位数。我需要帮助转换包含 2 位或更多位数字的中缀表达式。//Here's my code. My class doesn't use collection in JAVA.//Classes and Interfaces for stack, list, and tree are provided.private static final String DIGITS = "0123456789";public static String convertPostfixtoInfix(String toPostfix){    LinkedStack<String> s = new LinkedStack<>();    for(int i=0; i<toPostfix.length(); i++)    {        if(DIGITS.indexOf(toPostfix.charAt(i)) != -1)        {            s.push(toPostfix.charAt(i)+"");        }        else if(toPostfix.charAt(i) == " ");{}//do nothing for blank.        else        {            String temp = "";            temp += toPostfix.charAt(i);            String num1 = s.top();            s.pop();            String num2 = s.top();            s.pop();            s.push("(" + num2 + temp + num1 + ")");        }    }    return s.top();//top() is same as peek() method.}例如,使用此代码,输入: 4 5 - 9 2 1 + / *输出: ((4-5)*(9/(2+1)))输入: 40 5 - 9 20 1 + / *输出: (9*(2/(0+1)))
查看完整描述

1 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

这是你如何做到这一点。


首先,请注意一点。这行代码是多余的:


private static final String DIGITS = "0123456789";

如果你想检查一个字符是否是数字,你可以简单地做到这一点


Character.isDigit();

但为了简单起见,我保留了这条线。


现在,回到你的代码。为了提供解析多位数字的功能,您所要做的就是在遇到数字时循环访问输入字符串,直到第一个非数字字符。


我对你的代码进行了一些更改,以向您展示它应该如何工作的基本想法:


private static final String DIGITS = "0123456789";


public static String convertPostfixtoInfix(String toPostfix)

{

    LinkedStack<String> s = new LinkedStack<>();

    StringBuilder digitBuffer = new StringBuilder();  


    /* I've changed the 'for' to 'while' loop, 

       because we have to increment i variable inside the loop, 

       which is considered as a bad practice if done inside 'for' loop

    */

    int i = 0;

    while(i < toPostfix.length()) 

    {

        if(DIGITS.indexOf(toPostfix.charAt(i)) != -1)

        {

            //when a digit is encountered, just loop through toPostfix while the first non-digit char is encountered ...

            while (DIGITS.indexOf(toPostfix.charAt(i)) != -1) {

                digitBuffer.append(toPostfix.charAt(i++)); //... and add it to the digitBuffer

            }

            s.push(digitBuffer.toString());

            digitBuffer.setLength(0); //erase the buffer

        }

        //this if-else can also be replace with only one "if (toPostfix.charAt(i) != ' ')"

        else if(toPostfix.charAt(i) == ' ');{}//do nothing for blank.

        else

        {

            String temp = "";

            temp += toPostfix.charAt(i);


            String num1 = s.top();

            s.pop();

            String num2 = s.top();

            s.pop();

            s.push("(" + num2 + temp + num1 + ")");

        }

        i++;

    }


    return s.top();//top() is same as peek() method.

}

输入: 40 5 - 9 20 1 + / *

输出: ((40-5)*(9/(20+1)))


查看完整回答
反对 回复 2022-09-07
  • 1 回答
  • 0 关注
  • 93 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信