Dijkstra双栈算法

package com.Dijkstra;

import com.Stack.ArrayToStack;

/**
 * 利用2个栈实现简单的运算操作
 * Dijkstra双栈算法
 *
 * 1、将操作数压入操作数栈;
 * 2、将运算符压入运算符栈;
 * 3、忽略左括号;
 * 4、在遇到右括号时,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的运算结果压入操作数栈
 */
public class Evaluate {

    public static void main(String[] args) {
        String s = "(1+((2+3)*(4*5)))";
        test(s);
    }

    public static void test(String str){
        ArrayToStack<String> ops = new ArrayToStack<String>(10);//运算符栈
        ArrayToStack<Double> vals = new ArrayToStack<Double>(10);//操作数栈

        for(int i =0; i<str.length();i++){
            String s = (char)str.getBytes()[i] +""; //挨个取出字符
            //读取字符。如果是运算符则压入栈
            if      (s.equals("("))                  ;
            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("/")) ops.push(s);
            else if (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;
                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);  //将结果压入栈中
            }else {
                vals.push(Double.parseDouble(s)); //不是运算符号,则是操作数,将操作数压入操作数栈中
            }
        }
        System.out.println(vals.pop());//打印出最终结果
    }
}

栈可以用我的上一篇文章,利用数组实现一个简单的栈,也可以利用jdk自带的栈



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值