へのJava RPN(逆ポーランド記法)中置私は無視されますが、ケースのように思われない例えば「(」スタックはPRNを構築し、ために使用されていることを、かなり確信しています:。接尾
- 入力1: 52+(1 + 2)* 4-3
- 入力2: 52 +(+ 2(1)* 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
また、Javaインフィクスからrpnへの変換をこのリンクで確認することもできます:http://andreinc.net/2010/10/05/converting-infix-to-rpn-shunting-yard-algorithm/これは、PythonとJavaのアルゴリズムshunting-yardアルゴリズムの簡略版です。 –
[Stackを使用したPostfixへの挿入](http://stackoverflow.com/questions/7455862/infix-to-postfix-using-stacks)と他の多くのもの – EJP