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

例如需要计算 ( 1 + (  ( 2 + 3 ) * ( 4 * 5 ) ) )

我们以字符串的形式输入该表达式,利用两个栈来完成这个操作,其中一个栈保存运算符,一个栈保存操作数,过程是这样的:

表达式由括号,运算符号,操作数(数字)组成,从左到右处理这四种情况.

将操作数压入操作数栈.

将运算符压入运算符栈.

忽略左括号

遇到右括号时,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的结果压入操作数栈中.

在处理完最后一个括号时,操作数栈上只剩下了一个值,它就是表达式的值.每当算法遇到一个被括号包围并由一个运算符和两个操作数组成的子表达式时,它都将运算符和操作数计算的结果压入操作数栈中,这样的结果就好像在输入中用这个值代替了该子表达式,因此用这个子表达式得到的结果和原表达式相同,我们反复应用这个规律并的到一个最终值.

( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) )

( 1 + ( 5 * ( 4 * 5 ) ) )

( 1 + ( 5 * 20 ) )

( 1 + 100 )

101

下面是java的例子

public class Evaluate {

    public static void main(String[] args) {
        Stack<String> ops = new Stack<String>();    //运算符栈
        Stack<Double> vals = new Stack<Double>();    //操作数栈
        //IO流读取数据
        while(!StdIn.isEmpty()){
            String s = StdIn.readString();
            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));
            }
        }

        StdOut.print(vals.pop());

    }

}

时间: 2024-10-06 01:10:06

Dijkstra的双栈算术表达式的求值算法的相关文章

Dijkstra的双栈算术表达式求值

import java.util.Stack; import java.util.Scanner; public class Evaluate { public static void main(String[] args) { Stack<String> ops=new Stack<String>(); Stack<Double> vals=new Stack<Double>(); Scanner cin=new Scanner(System.in); /

Dijkstra的双栈算术表达式求值算法 C++实现

1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 template<typename T> 6 class Stack 7 { 8 private: 9 T stack[100]; 10 int i = 0; 11 public: 12 Stack() = default; 13 14 T pop() 15 { 16 if (i == -1) 17 { 18 cout <<

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

1 public static double evaluate(String inStr) { 2 Stack<String> ops = new Stack<String>(); //操作符栈 3 Stack<Double> vals = new Stack<Double>(); //操作数栈 4 char[] arr = inStr.toCharArray(); 5 for(char c : arr){ 6 String s =c+""

栈练习--Dijkstra的双栈算术表达式求值算法

此法还有待完善,比如在做除法运算时未判断除数是否为0,而且也可以加以扩展,比如log.sin.操作符优先级.. 1 public class Evaluate { 2 3 public static void main(String[] args) { 4 String steam = "( 1 + ( 2 + 3 ) * ( 4 * 5 ) ) )"; 5 // String steam = "( ( 1 + sqrt ( 5.0 ) ) / 2.0 )"; 6

算法手记(2)Dijkstra双栈算术表达式求值算法

这两天看到的内容是关于栈和队列,在栈的模块发现了Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app. 编程语言系统一般都内置了对算术表达式的处理,但是他们是如何在内部实现的呢?为了了解这个过程,我们可以自行搭建一套简易的算术表达式处理机制,这里就用到栈特性和本篇提到的Dijkstra算法. 概述:     算术表达式可能是一个数.或者是由一个左括号.一个算术表达式.一个运算符.另一个算术表达式和一个右括号组成的表达式.为了简化问题,这里定义的是未省略括号的算术表达式,它明确地

爪哇国新游记之二十二----算术表达式计算求值

代码: import java.util.ArrayList; import java.util.List; // 辅助类 class Item{ String value; boolean isNumber; public Item(String value,boolean isNumber){ this.value=value; this.isNumber=isNumber; } public Item(char c,boolean isNumber){ this.value=String.

简单算术表达式的求值程序

题目: 写一个三则运算(加减乘)表达式的求值程序,为了简化,规定数字只有一位,表达式内没有空格,但允许有括号.满足四则运算的结合性和优先级. 解答: 这是一道编译原理题,题目的要求把词法分析简单化了,只做语法分析.一般使用递归下降法求解. 首先写出BNF(包括结合性和优先权). exp → exp addop term | t e r m addop → + | - term → term mulop factor | f a c t o r mulop → * factor → ( exp )

Dijkstra双栈算术表达式求值

在看algs4的时候偶然发现了这个算法,又回顾了一遍当时数据结构课程里讲过的知识,当时很不在意.迟早是要还的,哎 用python实现了,比较麻烦的是我现在没有解决bash传参的问题,''(" ")" "*"都需要转义,我直接把"*"改成了"x". 这里又见识到了python的强大之处,list可以当做stack用,贴上官网doc push就用append,pop正好是内置函数,不说了上代码: 1 import sys

表达式求值算法、rpn、1470、1475、1477、1479

以下为表达式求值系列完整算法,借用C++语言,读者不妨对照下图表达式求值算法实例,仔细推敲. 1 /* 2 DATA:2015 1 30 3 From:13420228 4 */ 5 //测试数据: 6 // 4 7 // (0!+1)*2^(3!+4) - (5! - 67 - (8+9)) 8 // (1+2)*3+4*5 9 // 1.000 + 2 / 4 10 // ((1+2)*5+1)/(4^2)*3 11 #include <iostream> 12 #include <