zoukankan      html  css  js  c++  java
  • 栈的一个实例——Dijkstra的双栈算术表达式求值法

    Dijkstra的双栈算术表达式求值法,即是计算算术表达式的值,如表达式(1 + ( (2+3) * (4*5) ) )。

    该方法是

    使用两个栈分别存储算术表达式的运算符与操作数

    忽略左括号

    遇到右括号时,操作数栈弹出两个操作数,运算符栈弹出一个运算符,两个操作数按运算符计算,将结果压入操作数栈

    如表达式(1 + ( (2+3) * (4*5) ) )的计算流程如下:

    public class StackTest {
    
    	public static void main(String[] args) {
    
    		String str = "(1 + ( (2+3) * (4*5) ) )";	
    
    		Stack<String> ops = new Stack<String>();
    		Stack<Double> vals = new Stack<Double>();
    
    		for (int i=0; i<str.length(); i++) {
    
    			String ele = "" + str.charAt(i);
    
    			// Neglect the operator "(" and " "
    			if      (ele.equals("(") || ele.equals(" ")) ;
    			else if (ele.equals("+")) ops.push(ele);
    			else if (ele.equals("-")) ops.push(ele);
    			else if (ele.equals("*")) ops.push(ele);
    			else if (ele.equals("/")) ops.push(ele);
    
    			else if (ele.equals(")")) {
    
    				String op = ops.pop();
    				double v1 = vals.pop();
    				double v2 = vals.pop();
    
    				if (op.equals("+")) vals.push(v1 + v2);
    				if (op.equals("-")) vals.push(v1 - v2);
    				if (op.equals("*")) vals.push(v1 * v2);
    				if (op.equals("/")) vals.push(v1 / v2);
    			}
    
    			else vals.push(Double.valueOf(ele));
    
    		}
    
    		System.out.println(vals.pop());
    	}
    }
    

      

  • 相关阅读:
    构建可靠的系统
    netty详解之reactor模型
    netty详解之io模型
    小明的魔法调度框架之旅
    JAVA版-微信高清语音.speex转.wav格式
    Spring Data JPA 缓存结合Ehcache介绍
    @media print样式 关于table断页
    JBPM学习第6篇:通过Git导入项目
    JBPM学习第5篇:Mysql配置
    JBPM学习第4篇:10分钟熟悉Eclipse
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/8185730.html
Copyright © 2011-2022 走看看