`

表达式求值:Java

 
阅读更多
import java.util.ArrayList;
import java.util.Stack;


public class PostfixExp {

	private Stack<String> opStack;
	private Stack<String> expStack;
	private String[] ops = {"+", "-", "*", "/", "(", ")", "#"};
	
	public PostfixExp() {
		opStack = new Stack<String>();
		expStack = new Stack<String>();
	}
	
	private boolean isOp(char c) {
		String cStr = Character.toString(c);
		
		for (String op : ops) {
			if(cStr.equals(op)) {
				return true;
			}
		}
		
		return false;
	}
	
	private boolean isOp(String str) {
		for(String op : ops) {
			if(str.equals(op)) {
				return true;
			}
		}
		
		return false;
	}
	
	private int getOpPriority(String op){
		if("+".equals(op) || "-".equals(op)) {
			return 1;
		}
		else if("*".equals(op) || "/".equals(op)) {
			return 2;
		}
		else if("(".equals(op)) {
			return 3;
		}
		else if("#".equals(op)) {
			return 0;
		}
		
		return Integer.MAX_VALUE;
	}
	
	public String[] getItems(String str) {
		ArrayList<String> list = new ArrayList<String>();
		
		// Remove all blank spaces.
		str = str.replaceAll("\\s", "");
		
		int i = 0;
		StringBuilder sBuilder = new StringBuilder();
		while(i < str.length()) {
			if(i == str.length() - 1) {
				sBuilder.append(
						Character.toString(str.charAt(i)));
				list.add(sBuilder.toString());
			}
			
			if(!isOp(str.charAt(i))) {
				sBuilder.append(
					Character.toString(str.charAt(i)));
				
			}
			else {
				if(sBuilder.length() > 0) {
					list.add(sBuilder.toString());
					sBuilder.delete(0, sBuilder.length());
				}
				list.add(Character.toString(str.charAt(i)));
			}
			
			++i;
		}

		list.add("#");

		String[] result = new String[list.size()];
		return list.toArray(result);
	}
	
	public ArrayList<String> change2PostfixExp(String normalExp) {
		ArrayList<String> expList = new ArrayList<String>(); 
		String[] items = getItems(normalExp);
		
		opStack.clear();
		expStack.clear();
		
		opStack.push("#");
		
		int i = 0;
		while(i < items.length) {
			//System.out.println(i + ":" + items[i]);
			if(!isOp(items[i])) {
				expList.add(items[i]);
			}
			else {
				if(items[i].equals(")")){
					while(!opStack.isEmpty() && !opStack.peek().equals("(")) {
						expList.add(opStack.pop());
					}
					
					if(!opStack.isEmpty() && opStack.peek().equals("(")) {
						opStack.pop();
					}
					++i;
					continue;
				}
				
				if(items[i].equals("#")) {
					while(!opStack.isEmpty() && !opStack.peek().equals("#")) {
						expList.add(opStack.pop());
					}
					break;
				}
				
				if(!opStack.isEmpty()) {
					while(!opStack.isEmpty() 
							&& (getOpPriority(opStack.peek()) >= getOpPriority(items[i])
							&& !opStack.peek().equals("("))
					) {
						expList.add(opStack.pop());
					}
					opStack.push(items[i]);
				}
			}
			
			++i;
		}
		
		return expList;
	}
	
	public double calculate(ArrayList<String> postfixExp) {
		Stack<Double> calcStack = new Stack<Double>();
		
		int i = 0;
		String ite = null;
		double result = Double.MAX_VALUE;
		
		while(i < postfixExp.size()) {
			ite = postfixExp.get(i);
			if(!isOp(postfixExp.get(i))) {
				calcStack.push(new Double(
								Double.parseDouble(
										postfixExp.get(i))
				));
			}
			else {
				double num2 = calcStack.peek();
				calcStack.pop();
				if(!calcStack.isEmpty()) {
					double num1 = calcStack.peek();
					calcStack.pop();
					
					if("*".equals(ite)) {
						result = num1 * num2;
					}
					else if("+".equals(ite)) {
						result = num1 + num2;
					} 
					else if("-".equals(ite)) {
						result = num1 - num2;
					} 
					else if("/".equals(ite)) {
						result = num1 / num2;
					} 
					System.out.println(num1 + "\t" + ite + "\t" + num2 + " = " + result);
					calcStack.push(result);
				}
			}
			++i;
		}
		
		return result;
	}
	
	public static void main(String[] args) {
		PostfixExp pExp = new PostfixExp();
		
		//String exp = "a + b*c + (d * e + f) * g";
		//string exp = "1+1+3*2*3-4";
		//string exp = "2+(1+3)*2*3-4";
		//string exp = "2+1+3*2*(3-4)";
		String exp = "(13+10/2)*21*(39-4)";
		String case1 = "(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4))";
		String case2 = "(6*7+9+8/2*12+12/3)+88/11";
		String case3 = "(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4)))";
		String case4 = "(6*7+9+8/2*12+12/3)+((88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4)))+(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4))))";
		String case5 = "(6*7+9+8/2*12+12/3)+((88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4)))+(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4))))+(6*7+9+8/2*12+12/3)+((88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4)))+(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4))))";
		String case6 = "(3*(4+9)+8/(2*12)+12/3)+(((7+(13+10/2))*(21*(39-4)+(13+10/2)*21*(39-4)))+(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4))))+(6*7+9+8/2*12+12/3)+((88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4)))+(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4))))";

		ArrayList<String> expList = pExp.change2PostfixExp(case6);
		for(String item : expList) {
			System.out.print(item + " ");
		}
		System.out.println("\n");
		System.out.println("My answer is \t\t" + pExp.calculate(expList));
		
		int rightAnswer = (3*(4+9)+8/(2*12)+12/3)+(((7+(13+10/2))*(21*(39-4)+(13+10/2)*21*(39-4)))+(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4))))+(6*7+9+8/2*12+12/3)+((88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4)))+(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4))));
		System.out.println("The right answer is \t" + rightAnswer);
		
		System.out.println();
	}

}

 

分享到:
评论

相关推荐

    使用Java语言实现后缀表达式的求值算法

    后缀表达式求值:使用Java语言实现后缀表达式的求值算法; 后缀表达式求值:使用Java语言实现后缀表达式的求值算法; 后缀表达式求值:使用Java语言实现后缀表达式的求值算法; 后缀表达式求值:使用Java语言实现...

    java字符串表达式求值

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

    Java表达式求值2.0

    在Java编程语言中,表达式求值是一项基本且重要的任务,尤其在动态计算、脚本解析或编译器实现等领域。"Java表达式求值2.0"可能是指一个优化过的版本,用于更高效地处理Java中的数学或逻辑表达式。这个版本可能是...

    java算术表达式求值

    Java算术表达式求值是程序设计中一个常见的任务,特别是在动态计算或用户输入解析的场景下。在Java中,处理这种需求通常涉及到解析和计算字符串形式的数学表达式。这个压缩包文件包含了多种资源,可以帮助我们理解并...

    表达式求值计算(java实现)

    Java是一种广泛应用的面向对象的编程语言,它提供了丰富的工具和库来处理各种计算问题,包括表达式求值。本篇文章将深入探讨如何使用Java实现一个能够处理四则运算的表达式求值器。 首先,我们需要理解表达式求值的...

    java c++表达式求值(带括号和小数点)

    在这个场景中,我们需要使用Java和C++编程语言来实现一个能够处理带有括号和小数点的表达式求值器。 1. **逆波兰表示法** 逆波兰表示法是将操作符置于其操作数之后的一种方式。例如,表达式 "2 + 3 * 4" 在RPN中会...

    Java中缀表达式求值

    Java中缀表达式求值 Java中缀表达式求值是一种常见的计算机算法,用于评估中缀表达式的值。中缀表达式是一种常见的数学表达式形式,但是在计算机中难以直接计算,因为它的运算符优先级和结合性规则使得计算变得复杂...

    表达式求值 算法 代码 报告 流程图

    - **C++/Java**:可以使用递归函数或者栈来实现表达式求值,例如使用`std::stack`或自定义堆栈类。 - **Python**:Python的`eval()`函数可以直接执行字符串表达式,但可能存在安全风险。自定义求值函数更安全,...

    java 算术表达式求值器

    本文将深入探讨如何使用Java来设计一个算术表达式求值器。 首先,我们需要理解算术表达式的结构。一个基本的算术表达式通常由数字、运算符(如+、-、*、/、^等)和括号组成。例如,"2 + 3 * (4 - 5)"就是一个典型的...

    表达式求值 Java实现

    调用该类的静态方法CalString(String s),参数为要求值的表达式,CalString(String s)将返回计算结果,或者是出错信息。 设计思路:见代码的注释文档 反馈:本程序对以上支持的内容经过大量测试,所谓“只有...

    后缀表达式求值包及其使用

    本压缩包文件提供了后缀表达式的求值工具,包括两个主要功能:runsome和runall,它们均采用Java编程语言实现,同时也涉及到Scanner和PrintWriter的使用。 1. 后缀表达式:后缀表达式的优点在于,由于运算符总是在其...

    表达式求值 Java实现(改)

    调用该类的静态方法CalString(String s),参数为要求值的表达式,CalString(String s)将返回计算结果,或者是出错信息。 设计思路:见代码的注释文档 反馈:本程序对以上支持的内容经过大量测试,所谓“只有...

    表达式求值

    2. **求值**:求值过程是将表达式转换为结果值的过程。在计算表达式时,我们需要遵循特定的运算顺序,如先乘除后加减,以及处理括号内的优先级。 3. **栈**:栈是一种具有“后进先出”(LIFO)特性的数据结构。在...

    表达式求值_表达式求值栈_wrotey1q_栈表达式求值_

    在计算机科学领域,表达式求值是编程中的一个重要概念,主要涉及如何计算数学或逻辑表达式的值。在本场景中,我们关注的是基于栈的数据结构来实现表达式求值,这是许多编译器和解释器设计的基础部分。下面将详细讨论...

    后缀表达式求值.rar

    后缀表达式求值后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀...

    java模拟栈实现表达式求值代码.zip

    java模拟栈实现表达式求值代码.zip可以完全实现多种功能的计算,采用了算符优先关系计算表达式的值。 注意:表达式的形式为 #表达式# 的形式,两个#号只表示表达式的开始和结束,真正的表达式在中间部分。。。。

    中缀表达式转后缀表达式并求值(java)

    这个话题主要涉及将中缀表达式转换为后缀表达式,并对后缀表达式进行求值。下面,我们将详细探讨这两个过程。 首先,中缀表达式转后缀表达式的算法通常使用栈数据结构实现。步骤如下: 1. 初始化一个空栈。 2. 从...

    含变量的表达式求值问题.rar

    7. **代码实现**:使用某种编程语言(如C++、Python、Java等)实现表达式求值算法。代码应该清晰、可读性强,遵循良好的编程规范,以便于他人理解和维护。 8. **测试与调试**:为了确保算法的正确性,需要设计各种...

    java编写的表达式求值(支持小数,指数运算)

    java编写的表达式求值(支持小数,指数运算),第一次上传,多多指教

Global site tag (gtag.js) - Google Analytics