算术表达式定义:算术表达式可能是一个数,或者是由一个左括号一个算术表达式一个运算符另一个算术表达式一个右括号组成的表达式。
如:(4+(2*3)+(2*4))
使用Dijkstra所做的一个算法,双栈求值,用两个栈(一个保存运算符,一个用于保存操作数),
表达式由括号,运算符和操作数组成。(1).将操作数压入操作数栈(2).将运算符压入运算符栈;(3).忽略左括号;(4).在遇到右括号时候,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的运算结果压入操作数栈。
package Test.com;
import java.util.*;
public class Evaluate
{
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Stack<String> ops=new Stack<String>();
Stack<Double> vals=new Stack<Double>();
Scanner in=new Scanner(System.in);
String s=in.next();
char c[]=s.toCharArray();
for(int i=0;i<c.length;i++)
{
//读取字符,如果是运算符压入栈中
if(String.valueOf(c[i]).equals("("));
else if(String.valueOf(c[i]).equals("+"))
ops.push("+");
else if(String.valueOf(c[i]).equals("-"))
ops.push("-");
else if(String.valueOf(c[i]).equals("*"))
ops.push("*");
else if(String.valueOf(c[i]).equals("/"))
ops.push("/");
else if(String.valueOf(c[i]).equals("sqrt"))
ops.push("sqrt");
//如果遇到右括号,则弹出一个运算符,弹出所所需数量的操作数,并将运算结果压入栈中
else if(String.valueOf(c[i]).equals(")"))
{
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);
}
//如果输入不是运算符也不是括号,将其作为double值压入栈
else
vals.push(Double.parseDouble(String.valueOf(c[i])));
}
System.out.println(vals.pop());
}
}