#java #stack #postfix-notation
#java #stack #postfix-нотация
Вопрос:
Я написал коды для преобразования постфикса в инфикс, заключенный в полные скобки, как часть моей домашней работы, но этот код может преобразовывать инфиксное выражение только с однозначными числами. Мне нужна помощь для преобразования инфиксного выражения с числами из 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. Возможно, вы захотите показать пример ввода postfix.
Ответ №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)))