package method;
import java.util.Scanner;
import java.util.Stack;
/*
* Dijkstra的双栈算术表达式(未省略括号)求值算法
* 用两个栈(一个用于保存运算符,一个用于保存操作数)
* 1.将操作数压入操作数栈;
* 2.将运算符压入运算符栈;
* 3.忽略左括号;
* 4.在遇到右括号时,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的运算结果压入操作数栈;
*/
public class Evaluate
{
public static void main(String[] args)
{
Stack<String> ops=new Stack<String>();
Stack<Double> vals=new Stack<Double>();
Scanner sc=new Scanner(System.in);
while(sc.hasNext())
{/*读取字符,如果是运算符则将它压入运算符栈*/
String s=sc.nextLine();
if(s.equals("("));
else if(s.equals("="))
break;
else if(s.equals("+")||s.equals("-")||s.equals("*")||
s.equals("/")||s.equals("sqrt"))
ops.push(s);
else if(s.equals(")"))
{/*如果字符是“(”,弹出运算符和操作数,计算结果并压入操作数栈*/
String op=ops.pop();
double v=vals.pop();
if(op.equals("+"))
v=vals.pop()+v;
if(op.equals("-"))
v=vals.pop()-v;
if(op.equals("*"))
v=vals.pop()*v;
if(op.equals("/"))
v=vals.pop()/v;
if(op.equals("sqrt"))
v=Math.sqrt(v);
vals.push(v);
}
else /*如果字符既非运算符也非括号,将它作为double值压入操作数栈*/
vals.push(Double.parseDouble(s));
}
sc.close();
System.out.println(vals.pop());
}
}
((1+sqrt(5))/2.0)=
(
(
1
+
sqrt
(
5
)
)
/
2.0
)
=
1.618033988749895
(1+((2+3)*(4*5))) =
(
1
+
(
(
2
+
3
)
*
(
4
*
5
)
)
)
=
101.0
相关拓展阅读:
算法4--双栈的利用