算术表达式求值(Dijkstra)

算术表达式定义:算术表达式可能是一个数,或者是由一个左括号一个算术表达式一个运算符另一个算术表达式一个右括号组成的表达式。

如:(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());
 }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值