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

      

  • 相关阅读:
    2.NET Core设定数据库种子
    1.ASP.NET Core 中向 Razor Pages 应用添加模型
    获取文件夹目录下的文件信息
    dataGridView读写文本
    C# winform 启动外部程序
    netcore访问本地磁盘
    c#利用定时器自动备份数据库(mysql)
    c#mysql数据库备份还原
    Linux之旅(二)
    Linux之旅
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/8185730.html
Copyright © 2011-2022 走看看