Algorithms Fourth Edition Exercise 1.3.9
##将不带左括号的表达式转为中缀表达式
1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
–> ( ( 1 + 2 ) * ( ( 3 - 4 ) * ( 5 - 6 ) ) )
public static String infixExpressed(String[] strings) {
String result = new String();
Stack <String> stack = new Stack();
for (String s : strings) {
if (!s.equals(")")) {
stack.push(s);
}
if (s.equals(")")) {
String temp = new String();
int i = 0;
while (i < 3) {
if (!stack.isEmpty())
temp = (String)stack.pop() + temp;
i++;
}
temp = "(" + temp + ")";
stack.push(temp);
}
}
return stack.pop();
}
1.stack : [1] [+] [2] 读入 “)” 触发条件判断取出字符并拼接成 “(1+2)” 并 push
stack : [(1+2)]
中间省略多步
2.stack : [(1+2)] [*] [3] [-] [4] 读入 “)” 触发条件判断取出字符并拼接成 “(3+4)” 并 push
stack : [(1+2)] [*] [(3-4)]
中间省略多步
3.stack : [(1+2)] [*] [(3-4)] [*] [5] [-] [6] 读入 “)” 触发条件判断取出字符并拼接成 “(5-6)” 并 push
stack : [(1+2)] [*] [(3-4)] [*] [(5-6)]
4.stack : [(1+2)] [*] [(3-4)] [*] [(5-6)] 读入 “)” 触发条件判断取出字符并拼接成 “((3-4)*(5-6))” 并 push
stack : [(1+2)] [*] [((3-4)*(5-6))]
5.stack : [(1+2)] [*] [((3-4)*(5-6))] 读入 “)” 触发条件判断取出字符并拼接成 “((1+2)*((3-4)*(5-6)))” 并 push
stack : [((1+2)*((3-4)*(5-6)))]
6.pop 得到结果
输入:1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
输出: ( ( 1 + 2 ) * ( ( 3 - 4 ) * ( 5 - 6 ) ) )
输入:sqrt 1 + 2 ) )
输出: ( sqrt ( 1 + 2 ) )
空格忽略掉。
对比 (aistrate/AlgorithmsSedgewick)[https://github.com/aistrate/AlgorithmsSedgewick/blob/master/1-Fundamentals/1-3-BagsQueuesStacks/Ex_1_3_09.java] 的解法还是要简单易懂,Stack 也少用一个。
实际上后来发现这就是后缀表达式的表达过程嘛。
Stack<String> ops = new Stack<String>();
Stack<String> vals = new Stack<String>();
while (!StdIn.isEmpty())
{
String s = StdIn.readString();
if (s.equals("(")) ;
else if (s.equals("+") ||
s.equals("-") ||
s.equals("*") ||
s.equals("/") ||
s.equals("sqrt")) ops.push(s);
else if (s.equals(")"))
{
String op = ops.pop();
String v = vals.pop();
if (op.equals("+") ||
op.equals("-") ||
op.equals("*") ||
op.equals("/"))
v = String.format("( %s %s %s )", vals.pop(), op, v);
else if (op.equals("sqrt"))
v = String.format("( %s %s )", op, v);
vals.push(v);
}
else vals.push(s);
//else vals.push(((Double)Double.parseDouble(s)).toString());
}