`

JAVA 字符表达式 解析

阅读更多
尝试着,用JAVA进行字符串表达式解析计算。

居然没有得出个更好的写法,甚是郁闷。

鼓捣出下面一个类,只能求解不带括弧的表达式,看来数据结构中的关于表达式的算法,当初是没好好实现,到现在也没整出个比较好的方案。

package test.java;

import java.util.Stack;

public class MathUtil {

	public static final char add = '+';
	public static final char substract = '-';
	public static final char divide = '/';
	public static final char multiply = '*';

	public static final char leftParenthesis = '(';
	public static final char rightParenthesis = ')';

	public static final int isParenthesis = 2;

	public static final int isOperator = 1;

	public static final int isNotOperator = 0;

	public static String exec(String expression) {
		Stack<String> operatorStack = new Stack<String>();
		Stack<String> operandStack = new Stack<String>();
		int i = 0;

		StringBuffer operandBuffer = new StringBuffer();
		while (i < expression.length()) {
			char ch = expression.charAt(i);
			int result = checkOperator(ch);

			if (Character.isDigit(ch)) {
				operandBuffer.append(ch);
				// 运算数入栈
				if (i + 1 == expression.length()) {
					operandStack.push(operandBuffer.toString());
					operandBuffer.delete(0, operandBuffer.length());
				}

			} else if (result == isOperator) {
				// 运算数入栈
				if (operandBuffer.length() > 0) {
					operandStack.push(operandBuffer.toString());
					operandBuffer.delete(0, operandBuffer.length());
				}

				processStack(operatorStack, operandStack);

				// 运算符入栈
				operatorStack.push(Character.toString(ch));

			} else if (result == isParenthesis) {
				// 运算数入栈
				if (operandBuffer.length() > 0) {
					operandStack.push(operandBuffer.toString());
					operandBuffer.delete(0, operandBuffer.length());
				} 
				// 括弧入栈
				operatorStack.push(Character.toString(ch));
			}

			i++;
		}

		// 末尾栈处理
		processStack(operatorStack, operandStack);

		// 出空栈
		while (!operatorStack.isEmpty()) {
			processEndStack(operatorStack, operandStack);
		}
		return operandStack.pop();
	}

	public static void processEndStack(Stack<String> operatorStack,
			Stack<String> operandStack) {

		if (operatorStack.isEmpty())
			return;

		char operator = operatorStack.pop().charAt(0);
		int opearand1 = Integer.parseInt(operandStack.pop());
		int opearand2 = Integer.parseInt(operandStack.pop());
		String previewOperator = "@";
		if (!operatorStack.isEmpty()) {
			previewOperator = operatorStack.pop();
		}
		if (previewOperator.charAt(0) == MathUtil.substract) {
			opearand2 = -opearand2;
			operatorStack.push(Character.toString(MathUtil.add));
		} else if (!previewOperator.equals("@")) {
			operatorStack.push(previewOperator);
		}
		if (operator == MathUtil.add) {
			opearand1 = opearand2 + opearand1;

		} else if (operator == MathUtil.substract) {

			opearand1 = opearand2 - opearand1;
		} else {
			// 恢复栈
			operandStack.push(Integer.toString(opearand2));
			operatorStack.push(Character.toString(operator));
		}
		// 结果入栈
		operandStack.push(Integer.toString(opearand1));
	}

	public static void processStack(Stack<String> operatorStack,
			Stack<String> operandStack) {
		if (operatorStack.isEmpty())
			return;

		char operator = operatorStack.pop().charAt(0);
		int opearand1 = Integer.parseInt(operandStack.pop());
		int opearand2 = Integer.parseInt(operandStack.pop());
		if (operator == MathUtil.divide) {
			opearand1 = opearand2 / opearand1;

		} else if (operator == MathUtil.multiply) {
			opearand1 = opearand1 * opearand2;

		} else {
			// 恢复栈
			operandStack.push(Integer.toString(opearand2));
			operatorStack.push(Character.toString(operator));
		}
		// 结果入栈
		operandStack.push(Integer.toString(opearand1));

	}

	public static int checkOperator(char operator) {

		if (MathUtil.add == operator) {
			return MathUtil.isOperator;
		} else if (MathUtil.substract == operator) {
			return MathUtil.isOperator;
		} else if (MathUtil.divide == operator) {
			return MathUtil.isOperator;
		} else if (MathUtil.multiply == operator) {
			return MathUtil.isOperator;
		} else if (MathUtil.leftParenthesis == operator
				|| MathUtil.rightParenthesis == operator) {
			return MathUtil.isParenthesis;
		} else {
			return MathUtil.isNotOperator;
		}

	}
}
分享到:
评论

相关推荐

    Java 写的Cron表达式解析

    总结起来,Java中的Cron表达式解析涉及到字符串处理、时间计算以及用户界面交互。通过使用Java Swing创建一个Cron表达式解析器,你可以提供一个直观的工具,帮助开发者更好地理解和使用这种强大的时间调度机制。同时...

    Java表达式语法解析库 parboiled

    Java表达式语法解析库Parboiled是一个强大的工具,用于在Java平台上构建自定义的解析器。这个库由Sirthias开发,它引入了一种新的、更简洁的方式来编写解析规则,使得解析器的创建过程变得更加简单和高效。Parboiled...

    java字符串表达式求值

    java中求字符串表达式的值看起来很伤脑筋,但如果你用BeanShell,一切都变得很简单。

    Cron表达式解析 翻译为中英文.zip

    【标题】:Cron表达式解析 - 中英文对照 Cron表达式是Unix/Linux系统中的定时任务调度器Cron所使用的语法,也被广泛应用于Java世界,例如Quartz、Spring等框架。它允许用户以字符串的形式定义任务的执行时间,如...

    使用Java正则表达式分析处理日志

    Java作为广泛使用的编程语言,提供了强大的正则表达式支持,使得我们能够有效地解析和处理日志文件。本篇将围绕“使用Java正则表达式分析处理日志”这一主题,探讨如何利用Java的正则表达式功能来提取、过滤和操作...

    java正则表达式.zip

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它基于模式匹配的概念,能够高效地进行文本搜索、替换和解析。在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心...

    字符串表达式解析求值算法

    在编程领域,字符串表达式解析求值算法是一种关键的技术,尤其在计算器应用、脚本语言或者自定义计算逻辑实现中非常常见。这个算法的核心任务是将由字符组成的字符串转换为可执行的数学表达式,同时处理变量和各种...

    Java实现计算字符串表达式

    在Java编程语言中,计算字符串表达式是一项常见的任务,它涉及到解析、编译和执行包含数学运算符和操作数的字符串。这篇博客“Java实现计算字符串表达式”可能讲解了如何利用Java来处理这种问题,虽然具体的实现细节...

    Java编程艺术-表达式解析器.rar

    在Java中,表达式解析器的主要任务是读取输入的数学表达式字符串,将其分解成一个个有意义的组成部分(如操作数、运算符等),然后按照一定的语法规则进行解析和求值。 在设计表达式解析器时,通常会涉及以下几个...

    表达式解析工具

    这里提到的"表达式解析工具"显然是一个用Java实现的库,用于处理各种类型的表达式,包括数字计算和字符串比较。下面将详细解释这些知识点。 1. **表达式解析**: - **表达式**:在编程中,表达式是指能够返回一个...

    java正则实现解析算术表达式 (仅限+-*/和括号)

    java正则实现解析算术表达式 (仅限+-*/和括号)

    java实现简易算术表达式解析类

    总结来说,这个Java实现的简易算术表达式解析类是一个基础但实用的工具,它可以处理简单的数学问题,帮助开发者在不使用现成的解析库的情况下,快速实现对字符串表达式的计算功能。通过学习和理解这个实现,开发者...

    java正则表达式解析

    Java正则表达式解析是Java编程中的一个重要概念,它允许开发者通过模式匹配的方式来处理字符串,进行数据验证、搜索、替换等各种复杂操作。在Java中,正则表达式主要由`java.util.regex`包提供支持。下面我们将深入...

    java解析表达式JEXL实现办法

    Java解析表达式是一个常见的需求,特别是在需要动态计算或者执行用户输入的简单脚本时。JEXL(Java Expression ...JEXL的广泛应用和源码分析对于理解其工作原理和定制功能非常有帮助,是学习Java表达式解析的好资源。

    java编写的正则表达式解析器

    在Java编程语言中,实现正则表达式解析器可以帮助我们更高效地处理字符串,理解正则表达式的内部工作原理,并且可以自定义扩展其功能。本文将深入探讨Java中正则表达式的相关知识。 首先,Java中的正则表达式主要...

    Java中缀表达式求值

    `buildRPN` 方法将中缀表达式解析成后缀表达式,该方法使用栈来存储运算符,并根据运算符的优先级来确定其位置。 中缀表达式求值的应用非常广泛,例如计算器程序、科学计算软件等。掌握中缀表达式求值的算法和实现...

    Cron表达式解析类和时间相关操作工具类

    1、Cron表达式解析(比如Quartz的Cron表达式),计算下一次触发时间; 2、经常使用的时间相关的操作工具类,比如时间格式化,字符串、Date、localDate、LocalDateTime类型间的转换等

    Java算术表达式计算类库 ExpressionJ

    当表达式解析或计算过程中出现错误时,ExpressionJ会抛出异常,帮助开发者快速定位问题。此外,它还提供了一些方法来检查表达式的语法是否正确,以便于在计算前进行预验证。 ### 6. 性能与效率 由于ExpressionJ...

    Java正则表达式详解+基于HTMLParser解析HTML网页

    如何在Java程序中利用正则表达式实现对字符串的解析.另外,HTMLParser是一款很强大的对HTML网页进行解析的工具,其中大量地用到正则表达式.

    Java 正则表达式判断字符串是否包含中文

    ### Java正则表达式判断字符串是否包含中文 在日常的软件开发过程中,我们经常会遇到需要对输入的字符串进行校验的情况。例如,在处理用户输入、文本分析或数据清洗时,可能需要判断一个字符串中是否包含中文字符。...

Global site tag (gtag.js) - Google Analytics