Dijkstra的双栈算数表达式求值算法

Dijkstra的双栈算数表达式求值算法

说明:这个算法的输入要求是必须补全所有括号,否则算法会出错,数字和符号之间应该留有一个空格。

import edu.princeton.cs.algs4.Stack;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

public class Evaluate {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Stack<String> ops = new Stack<String>();//保存符号
        Stack<Double> vals = new Stack<Double>();//保存计算数值
        while(!StdIn.isEmpty()){
            String s = StdIn.readString();//读取字符
            if(s.equals("("))   ;//如果是“(”的话忽略,什么也不做
            else if(s.equals("+"))  ops.push(s);//如果是+,-,*,/和sqrt的话入栈到ops
            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("sqrt"))   ops.push(s);
            else if(s.equals(")")){
                double a = vals.pop();
                String sign = ops.pop();
                if(sign.equals("+"))    a = vals.pop()+a;
                else if(sign.equals("-"))   a = vals.pop()-a;
                else if(sign.equals("*"))   a = vals.pop()*a;
                else if(sign.equals("/"))   a = vals.pop()/a;
                else if(sign.equals("sqrt"))    a = Math.sqrt(a);
                vals.push(a);
                }
            else    
                vals.push(Double.parseDouble(s));
        }
        StdOut.println(vals.pop());//最后栈中仅有一个数值,那就是结果
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值