我敢肯定,這堆被用於建築PRN和「(」被忽略,但它似乎並沒有這樣的情況,例如:Java的RPN(逆波蘭式)綴與postfix
- 輸入1: 52+(1 + 2)* 4-3
- 輸入2: 52 +((1 + 2)* 4)-3
- 輸入3:(52 + 1 +2)* 4-3
輸入1和輸入2輸出應該相同,輸入1和輸入3應該不同。
- 輸出1: 52 1 2 + 4 3 - * +
- 輸出2: 52 1 2 + 4 * 3 - +
- 輸出3: 52 1 2 + 4 3 - * +
public static String Infix2(String input) {
char[] in = input.toCharArray();
Stack<Character> stack = new Stack<Character>();
StringBuilder out = new StringBuilder();
for (int i = 0; i < in.length; i++)
switch (in[i]) {
case '+':
case '*':
case '-':
out.append(' ');
stack.push(in[i]);
break;
case ' ':
case '(':
break;
case ')':
out.append(' ');
out.append(stack.pop());
break;
default:
out.append(in[i]);
break;
}
while (!stack.isEmpty()) {
out.append(' ');
out.append(stack.pop());
}
return out.toString();
}
假設我想輸入1和3也上班,我應該用什麼方法呢?
編輯: 修改'+',' - ','*'和'/'對給定的輸入有效。
public static String Infix2(String input) {
if (input == null)
return "";
char[] in = input.toCharArray();
Stack<Character> stack = new Stack<Character>();
StringBuilder out = new StringBuilder();
for (int i = 0; i < in.length; i++)
switch (in[i]) {
case '+':
case '-':
while (!stack.empty()
&& (stack.peek() == '*' || stack.peek() == '/'))
out.append(' ').append(stack.pop());
case '*':
case '/':
out.append(' ');
case '(':
stack.push(in[i]);
case ' ':
break;
case ')':
while (!stack.empty() && stack.peek() != '(')
out.append(' ').append(stack.pop());
if (!stack.empty())
stack.pop();
break;
default:
out.append(in[i]);
break;
}
while (!stack.isEmpty())
out.append(' ').append(stack.pop());
return out.toString();
}
我不認爲你的輸出1和2是正確的:*先行 - ,所以它應該是'52 1 2 + 4 * 3 - +',不是嗎? – butterchicken 2009-08-24 07:24:22
你也可以檢查這個鏈接的Java中綴爲rpn轉換器:http://andreinc.net/2010/10/05/converting-infix-to-rpn-shunting-yard-algorithm/。它是python和Java中算法分流碼算法的簡化版本。 – 2010-10-06 06:48:38
重複[Infix到Postfix使用堆棧](http://stackoverflow.com/questions/7455862/infix-to-postfix-using-stacks)和其他許多人 – EJP 2014-03-21 09:22:14