对于需要做出计算器功能的题目
有这样的一种简单算法可以轻易解决问题
其优势在于算法简单,很好的利用了栈的LIFO特性
缺点也很明显:不能很好的适应用户的输入,输入必须符合格式
格式要求:
数与数之间,操作符与数之间必须要有空格进行连接
整个表达式需要被括号圈住
操作符数量必须与括号组数相等且均有意义
必须符合以上三个条件 该算法才能够起到作用
具体实现如下
import edu.princeton.cs.algs4.*;
import static java.lang.System.out;
public class Counter {
public static void main(String args[]){
Stack<String> ops = new Stack<String>();
Stack<Double> vals = new Stack<Double>();
while(!StdIn.isEmpty())
{
String s;
s = StdIn.readString();
if(s.equals("("));
else if(s.equals("+")) ops.push(s);
else if(s.equals("-")) ops.push(s);
else if(s.equals("*")) ops.push(s);
else if(s.equals("/")) ops.push(s);
else if(s.equals(")"))
{
String op = ops.pop();
double val = vals.pop();
if(op.equals("+")) val+=vals.pop();
else if(op.equals("-")) val-=vals.pop();
else if(op.equals("*")) val*=vals.pop();
else if(op.equals("/")) val/=vals.pop();
vals.push(val);
}
else
vals.push(Double.parseDouble(s));
}
StdOut.println(vals.pop());
}
}
注:algs4为《算法》配套库文件,需自行下载。