【发布时间】:2016-09-03 19:13:33
【问题描述】:
我正在阅读关于算法和数据结构的book,并尝试按照示例进行操作。我尝试实现的是 Dijkstra 的用于表达式评估的两栈算法。它以( 1 + 2 ) * 3 之类的字符串形式接受输入,然后计算表达式。我的代码可以编译,但没有产生正确的输出。
上述表达式的输出为:
3.0
这是我的代码:
public class Eval {
public static void main(String[] args) {
String s = "( 1 + 2 ) * 3";
evaluateAndPrintResult(s);
}
public static void evaluateAndPrintResult(String s)
{
String[] str = s.split("\\s+");
Queue<String> q = new LinkedList<String>();
for(String ss : str)
q.add(ss);
Stack<String> ops = new Stack<String>();
Stack<Double> vals = new Stack<Double>();
while (!q.isEmpty())
{ // Read token, push if operator.
String token = q.poll();
if (token.equals("(")) ;
else if (token.equals("+")) ops.push(s);
else if (token.equals("-")) ops.push(s);
else if (token.equals("*")) ops.push(s);
else if (token.equals("/")) ops.push(s);
else if (token.equals("sqrt")) ops.push(s);
else if (token.equals(")"))
{ // Pop, evaluate, and push result if token is ")".
String op = ops.pop();
double v = vals.pop();
if (op.equals("+")) v = vals.pop() + v;
else if (op.equals("-")) v = vals.pop() - v;
else if (op.equals("*")) v = vals.pop() * v;
else if (op.equals("/")) v = vals.pop() / v;
else if (op.equals("sqrt")) v = Math.sqrt(v);
vals.push(v);
} // Token not operator or paren: push double value.
else vals.push(Double.parseDouble(token));
}
System.out.println(vals.pop());
}
}
我对程序的理解不够好,无法更正它。如何更正我的程序?
【问题讨论】:
-
您只在找到字符 ')' 时进行计算。如果您将输入更改为
( ( 1 + 2 ) * 3 ),它可能会起作用 -
@RafaelAlmeida - 不!没用。