我正在尝试解决一个涉及将反向波兰表示法转换为中缀表示法的编程挑战。例如: 1 3 + 2 4 5 - + / 将是: ((1+3)/(2+(4-5))) 我的解决方案到目前为止确实有效,但速度不够快。所以我正在寻找任何优化建议。public class betteralgo { public static void main(String[] args) throws IOException { BufferedReader bi = new BufferedReader(new InputStreamReader(System.in)); String line = bi.readLine(); String[] input = line.split(" "); StringBuilder builder = new StringBuilder(); Stack<String> stack = new Stack<String>(); for(String e:input) { switch(e){ case("+"): case("-"): case("*"): case("/"): String i = stack.pop(); String k = stack.pop(); stack.push("(" + k + e + i + ")"); break; default: stack.push(e); } } System.out.println(stack.pop()); } }
3 回答
qq_笑_17
TA贡献1818条经验 获得超7个赞
只是出于好奇,这个递归解决方案会更快吗?
public static void main(String[] args)
{
String input = "1 3 + 2 4 5 - + /";
List<String> terms = new ArrayList<>(Arrays.asList(input.split(" ")));
String result = build(terms);
System.out.println(result);
}
static String build(List<String> terms)
{
String t = terms.remove(terms.size()-1);
if("+-/*".indexOf(t) >= 0)
{
String op2 = build(terms);
String op1 = build(terms);
return "(" + op1 + t + op2 + ")";
}
else return t;
}
Qyouu
TA贡献1786条经验 获得超11个赞
由于使用越来越长的表达式,您的问题是二次复杂性。解决办法是建一棵树。而不是
"(" + k + e + i + ")"
创建一个包含内容e
和子节点的新节点k
以及i
. 然后通过树的简单传递允许您生成任何表示(中缀、前缀或后缀)。
添加回答
举报
0/150
提交
取消