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中求字符串表达式的值看起来很伤脑筋,但如果你用BeanShell,一切都变得很简单。
在Java编程语言中,表达式求值是一项基本且重要的任务,尤其在动态计算、脚本解析或编译器实现等领域。"Java表达式求值2.0"可能是指一个优化过的版本,用于更高效地处理Java中的数学或逻辑表达式。这个版本可能是...
Java算术表达式求值是程序设计中一个常见的任务,特别是在动态计算或用户输入解析的场景下。在Java中,处理这种需求通常涉及到解析和计算字符串形式的数学表达式。这个压缩包文件包含了多种资源,可以帮助我们理解并...
Java是一种广泛应用的面向对象的编程语言,它提供了丰富的工具和库来处理各种计算问题,包括表达式求值。本篇文章将深入探讨如何使用Java实现一个能够处理四则运算的表达式求值器。 首先,我们需要理解表达式求值的...
在这个场景中,我们需要使用Java和C++编程语言来实现一个能够处理带有括号和小数点的表达式求值器。 1. **逆波兰表示法** 逆波兰表示法是将操作符置于其操作数之后的一种方式。例如,表达式 "2 + 3 * 4" 在RPN中会...
Java中缀表达式求值 Java中缀表达式求值是一种常见的计算机算法,用于评估中缀表达式的值。中缀表达式是一种常见的数学表达式形式,但是在计算机中难以直接计算,因为它的运算符优先级和结合性规则使得计算变得复杂...
- **C++/Java**:可以使用递归函数或者栈来实现表达式求值,例如使用`std::stack`或自定义堆栈类。 - **Python**:Python的`eval()`函数可以直接执行字符串表达式,但可能存在安全风险。自定义求值函数更安全,...
本文将深入探讨如何使用Java来设计一个算术表达式求值器。 首先,我们需要理解算术表达式的结构。一个基本的算术表达式通常由数字、运算符(如+、-、*、/、^等)和括号组成。例如,"2 + 3 * (4 - 5)"就是一个典型的...
调用该类的静态方法CalString(String s),参数为要求值的表达式,CalString(String s)将返回计算结果,或者是出错信息。 设计思路:见代码的注释文档 反馈:本程序对以上支持的内容经过大量测试,所谓“只有...
本压缩包文件提供了后缀表达式的求值工具,包括两个主要功能:runsome和runall,它们均采用Java编程语言实现,同时也涉及到Scanner和PrintWriter的使用。 1. 后缀表达式:后缀表达式的优点在于,由于运算符总是在其...
调用该类的静态方法CalString(String s),参数为要求值的表达式,CalString(String s)将返回计算结果,或者是出错信息。 设计思路:见代码的注释文档 反馈:本程序对以上支持的内容经过大量测试,所谓“只有...
2. **求值**:求值过程是将表达式转换为结果值的过程。在计算表达式时,我们需要遵循特定的运算顺序,如先乘除后加减,以及处理括号内的优先级。 3. **栈**:栈是一种具有“后进先出”(LIFO)特性的数据结构。在...
在计算机科学领域,表达式求值是编程中的一个重要概念,主要涉及如何计算数学或逻辑表达式的值。在本场景中,我们关注的是基于栈的数据结构来实现表达式求值,这是许多编译器和解释器设计的基础部分。下面将详细讨论...
后缀表达式求值后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀...
java模拟栈实现表达式求值代码.zip可以完全实现多种功能的计算,采用了算符优先关系计算表达式的值。 注意:表达式的形式为 #表达式# 的形式,两个#号只表示表达式的开始和结束,真正的表达式在中间部分。。。。
这个话题主要涉及将中缀表达式转换为后缀表达式,并对后缀表达式进行求值。下面,我们将详细探讨这两个过程。 首先,中缀表达式转后缀表达式的算法通常使用栈数据结构实现。步骤如下: 1. 初始化一个空栈。 2. 从...
7. **代码实现**:使用某种编程语言(如C++、Python、Java等)实现表达式求值算法。代码应该清晰、可读性强,遵循良好的编程规范,以便于他人理解和维护。 8. **测试与调试**:为了确保算法的正确性,需要设计各种...
java编写的表达式求值(支持小数,指数运算),第一次上传,多多指教