Нужна помощь для преобразования Postfix в Infix с использованием стека

Я написал коды для преобразования постфикса в полностью заключенный в скобки инфикс как часть моей домашней работы, но этот код может преобразовывать инфиксное выражение только с однозначными числами. Мне нужна помощь для преобразования инфиксного выражения с числами из 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)))


person iamNatural    schedule 27.03.2019    source источник
comment
Возможно, вы захотите показать пример постфиксного ввода.   -  person Tim Biegeleisen    schedule 27.03.2019


Ответы (1)


Вот как вы можете это сделать.

Прежде всего, небольшое замечание. Эта строка кода является избыточной:

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)))

person Pavel Smirnov    schedule 27.03.2019