【发布时间】:2009-08-24 07:16:47
【问题描述】:
我很确定,堆栈用于构建 PRN,'(' 被忽略,但似乎并非如此。例如:
- 输入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 - +,不是吗? -
您还可以查看此链接以获取 java 中缀转 rpn 转换器:andreinc.net/2010/10/05/…。是python和Java算法调车场算法的简化版。
-
Infix to Postfix using stacks 的副本,以及许多其他人