`

利用栈实现简单算术表达式求值

 
阅读更多

代码利用栈来实现算术表达式的求值功能,仅用于举例说明栈的用例,没有考虑运算符的优先级,并且要求表达式的各个部分必须用空格分隔:

package com.mycode.algorithms.stack;

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

public class Evaluate {
	static Stack<String> ops = new Stack<String>();
	static Stack<Double> params = new Stack<Double>();
	
	static Map<String,String> VALIDATE_OPS = new HashMap<String,String>();
	static {
		VALIDATE_OPS.put("+", "+");
		VALIDATE_OPS.put("-", "-");
		VALIDATE_OPS.put("*", "*");
		VALIDATE_OPS.put("/", "/");
	}

	public static void main(String[] args) {
		System.out.println(calcute("( 5 + ( 3 * ( 4 + 5 ) ) + 100 )"));
	}
	
	public static void clear(){
		ops.clear();
		params.clear();
	}
	
	public static boolean isOps(String symbol){
		return VALIDATE_OPS.get(symbol)!=null;
	}
	
	public static Double calcuteValue(String symbol,Double v1,Double v2){
		String op = VALIDATE_OPS.get(symbol);
		if(op.equals("+")){
			return v1 + v2;
		}else if(op.equals("-")){
			return v1 -v2;
		}else if(op.equals("*")){
			return v1 * v2;
		}else if(op.equals("/")){
			return v1 / v2;
		}
		throw new RuntimeException("not supported operation:"+op);
	}
	
	
	public static Double calcute(String expression){
		clear();
		for(String symbol : expression.split(" ")){
			if(symbol.trim().equals("") || symbol.equals("(")) continue;
			if(isOps(symbol)){
				ops.add(symbol);
			}else if(symbol.equals(")")){
				params.add(calcuteValue(ops.pop(), params.pop(), params.pop()));
			}else{
				params.add(Double.valueOf(symbol));
			}
			System.out.println(params);
			System.out.println(ops);
			System.out.println("====================");
		}
		if(!ops.isEmpty()){
			params.add(calcuteValue(ops.pop(), params.pop(), params.pop()));
		}
		return params.pop();
	}
}

运行结果:

[5.0]
[]
====================
[5.0]
[+]
====================
[5.0, 3.0]
[+]
====================
[5.0, 3.0]
[+, *]
====================
[5.0, 3.0, 4.0]
[+, *]
====================
[5.0, 3.0, 4.0]
[+, *, +]
====================
[5.0, 3.0, 4.0, 5.0]
[+, *, +]
====================
[5.0, 3.0, 9.0]
[+, *]
====================
[5.0, 27.0]
[+]
====================
[5.0, 27.0]
[+, +]
====================
[5.0, 27.0, 100.0]
[+, +]
====================
[5.0, 127.0]
[+]
====================
132.0


分享到:
评论

相关推荐

    栈的应用----算术表达式求值程序

    本文将深入探讨如何利用栈来实现一个算术表达式求值的程序。 首先,我们要理解算术表达式的构成。一个基本的算术表达式可能包含数字、运算符(如加号"+"、减号"-"、乘号"*"和除号"/")以及括号用于改变运算顺序。...

    基于栈结构的中缀表达式求值实验报告

    《基于栈结构的中缀表达式求值》 在计算机科学中,中缀表达式是一种常见...本实验报告详细介绍了如何利用栈结构实现中缀表达式的求值,从原理、设计到实现都进行了深入讨论,旨在提高读者对数据结构和算法应用的认识。

    数据结构的算术表达式求值

    数据结构的算术表达式求值是一个常见的编程问题,它涉及到数据结构中的栈(stack)这一数据结构的应用。算术表达式通常包含操作数(operands)、运算符(operators)和分隔符(delimiter)。在这个问题中,我们关注...

    设计一个程序,演示用算符优先法对算术表达式求值的过程

    算术表达式的求值是计算机科学中的一个基础问题,它不仅是编程语言实现的重要组成部分,也是理解数据结构(如栈)的关键应用案例之一。算符优先法是一种用于解析算术表达式的有效方法,特别是对于处理四则运算表达式...

    数据结构,C++实现基于链栈的简单算术表达式求值

    数据结构,C++实现基于链栈的简单算术表达式求值,本项目的目标是实现一个简单的算术表达式求解器,它能够处理基本的加、减、乘、除运算,并使用链栈数据结构进行求值。设计内容:对带括号的任意算术表达式求值。设计...

    长沙理工大学数据结构栈的实现与应用算术表达式求值实验报告.doc

    3. 利用栈解决算术表达式求值问题 四、数据结构与算法思想描述 在本实验中,我们使用了顺序读取中缀表达式的方法来实现算术表达式的计算。具体来说,我们使用了以下步骤: 1. 当遇到数字时,将数字入数字栈 2. 当...

    算术表达式求值演示1

    总之,"算术表达式求值演示1"是一个基于C或C++实现的简单计算器应用,它展示了如何解析和计算用户输入的算术表达式。通过这个项目,我们可以学习到词法分析、语法分析和表达式求值的基本原理,以及在实际编程中如何...

    算术表达式求值演示

    本示例中的“算术表达式求值演示”聚焦于如何利用数据结构来解决计算复杂算术表达式的问题。在这个过程中,我们将探讨栈这一重要的数据结构,以及它是如何在计算过程中起到关键作用的。 栈是一种后进先出(LIFO)的...

    C语言编写的算术表达式求值程序

    总结起来,这个C语言的算术表达式求值程序涵盖了基础的数据结构——栈的应用,以及算术表达式的解析和错误处理等核心知识点。通过实现这样的程序,开发者不仅能加深对C语言的理解,还能锻炼逻辑思维能力和问题解决...

    算术表达式求值

    根据提供的文件信息,本文将详细解释如何利用栈这一数据结构来实现算术表达式的求值。此过程涉及栈的基本操作及算法设计。 ### 栈的基本概念 栈是一种只能在一端进行插入或删除操作的线性表,这端被称为栈顶(top...

    数据结构实验栈的运用(表达式求值)

    本文将详细介绍如何利用栈这一数据结构来实现任意位数表达式的求值。栈是一种后进先出(LIFO)的数据结构,非常适合处理涉及括号匹配、运算符优先级等问题的情景。在表达式求值的应用中,栈可以用来存储操作数或...

    利用两个栈求表达式求值

    ### 利用两个栈求表达式求值 在计算机科学领域,栈是一种非常重要的数据结构,在许多场景下都有着广泛的应用,...这种方法不仅适用于简单的算术表达式,还可以扩展到更复杂的数学表达式,甚至编程语言中的表达式求值。

    栈的应用之中缀表达式求值(QT平台)

    然而,在计算机处理这种表达式时,由于没有明确的优先级和运算顺序,我们需要将其转换为后缀表达式(也称为逆波兰表示法)或者利用栈来解析。 在本程序中,采用C++语言编写,结合QT作为开发平台,可以实现用户友好...

    C++实现的表达式求值

    本文将详细讲解如何使用C++来实现一个简单的表达式求值器,该求值器能处理包括括号在内的复杂算术表达式。 首先,我们需要理解表达式求值的基本原理。在计算表达式时,我们通常遵循运算符的优先级和结合性规则,...

    数据结构 算术表达式求值演示

    在这个“算术表达式求值演示”中,我们主要关注的是如何利用数据结构,特别是队列和栈,来解析和计算数学表达式。吴伟民可能是这个资源的作者,他的目标是帮助学习数据结构的学生理解和应用这些概念。 首先,我们来...

    数据结构大作业C++实现简单的计算器——算术表达式计算(包含实验报告)

    设计一个程序,演示用算符优先法对算术表达式求值的过程。 【基本要求】 以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利用运算符优先关系,实现对算术四则混合运算表达式的求值。 【测试数据】 ...

    用栈的应用编一个表达式求值的程序(c语言)

    本文将探讨如何使用C语言结合栈的应用来实现一个表达式求值程序。该程序使用两个栈,分别存储操作数和操作符,以支持算术运算符的正确计算顺序和优先级处理。 ### 栈的实现 在该表达式求值器中,栈的结构体定义为...

    数据结构、栈、表达式求值

    通过这样的方法,我们不仅可以解决简单的算术表达式求值,还可以扩展到更复杂的表达式,包括带有变量、函数调用甚至条件语句的表达式。理解并掌握栈在表达式求值中的应用,对于学习数据结构和算法,尤其是理解计算机...

    表达式求值的实验报告

    这篇实验报告主要探讨了如何利用栈来实现算术表达式的求值,这对于初学者理解程序设计语言中的表达式计算机制非常有帮助。报告中提到,表达式计算是程序设计语言的基础,而这个问题可以通过将数学表达式转化为后缀...

    约瑟夫环和算术表达式求值

    在数据结构领域内,约瑟夫环问题和算术表达式求值是两个经典且具有挑战性的实验主题,它们不仅考验着学生对数据结构知识的掌握程度,还锻炼了其编程实现能力。通过这两个问题,我们不仅能够了解到链表、栈等数据结构...

Global site tag (gtag.js) - Google Analytics