需要使用堆栈将 Postfix 转换为 Infix 的帮助
Need help for conversion of Postfix to Infix using stack
作为作业的一部分,我编写了将后缀转换为全括号中缀的代码,但此代码只能将单个数字的中缀表达式转换。我需要有关转换具有 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.
}
例如,使用此代码,
input: 4 5 - 9 2 1 + / *
output: ((4-5)*(9/(2+1)))
input: 40 5 - 9 20 1 + / *
output: (9*(2/(0+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.
}
Input: 40 5 - 9 20 1 + / *
Output: ((40-5)*(9/(20+1)))
作为作业的一部分,我编写了将后缀转换为全括号中缀的代码,但此代码只能将单个数字的中缀表达式转换。我需要有关转换具有 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.
}
例如,使用此代码,
input: 4 5 - 9 2 1 + / *
output: ((4-5)*(9/(2+1)))
input: 40 5 - 9 20 1 + / *
output: (9*(2/(0+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.
}
Input: 40 5 - 9 20 1 + / *
Output: ((40-5)*(9/(20+1)))