栈的运用
用双栈对输入的字符串算式进行运算
算法要点
- 将操作数压入操作数栈
- 将运算符压入运算符栈
- 忽略左括号
- 遇到右括号,弹出一个运算符,弹出与运算符对应的操作数个数,并将运行结果压入操作数栈
栈的类图
栈内包含了两个内部类,Node和ReverseIterator。
前者是节点的数据类型,后者是自定义的迭代类型实现了Iterator接口。
实现
public class Evaluate {
public static void main(String[] args) {
Stack<String> ops = new Stack<String>();
Stack<Double> vals = new Stack<Double>();
String str = "";
while(!str.equals("#"))// "#"号作为数据输入结束符
{
str = StdIn.readString();
if(str.equals("#"));
else if(str.equals("("));
else if(str.equals("+")) ops.push(str);
else if(str.equals("-")) ops.push(str);
else if(str.equals("*")) ops.push(str);
else if(str.equals("/")) ops.push(str);
else if(str.equals("sqrt")) ops.push(str);
else if(str.equals(")"))
{
String opsStr = ops.pop();
double val = vals.pop();
if(opsStr.equals("+")) val = vals.pop() + val;
else if(opsStr.equals("-")) val = vals.pop() - val;
else if(opsStr.equals("*")) val = vals.pop() * val;
else if(opsStr.equals("/")) val = vals.pop() / val;
else if(opsStr.equals("sqrt")) val = Math.sqrt(val);
vals.push(val);
}//以上是对运算符的操作
else vals.push(Double.parseDouble(str));
}
StdOut.print(vals.pop());//操作数栈中剩下的最后一个数就是最后的运算结果
}
}
测试