`
- 浏览:
106422 次
- 性别:
- 来自:
深圳
-
java 代码
- import java.math.BigDecimal;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Stack;
- import java.util.StringTokenizer;
-
- public class Expression {
-
- public static void main(String[] args) {
-
- String expres = "c*d+(((a+67.32)+(c-39))/d+10)";
-
-
- HashMap variables = new HashMap();
- variables.put("a",new BigDecimal("10"));
- variables.put("b",new BigDecimal("20"));
- variables.put("c",new BigDecimal("30"));
- variables.put("d",new BigDecimal("40"));
-
- Expression calc = new Expression(variables,expres);
-
-
- double resut = calc.getResult().doubleValue();
- System.out.println(" Expression = "+expres);
- calc.printVariables();
- System.out.println(" Result = " + resut);
-
- }
-
-
-
- private String expression;
- private HashMap operators = new HashMap();
- {
- operators.put("+", "1");
- operators.put("-", "1");
- operators.put("/", "2");
- operators.put("*", "2");
- operators.put("(", "0");
- }
- private Context ctx;
-
-
- public Expression(HashMap vars,String expr) {
- ctx = new Context(vars);
- expression = expr;
- }
-
- public BigDecimal getResult() {
-
-
- String pfExpr = infixToPostFix(toVaviable(expression));
-
-
- Expressions rootNode = buildTree(pfExpr);
-
-
- return rootNode.evaluate(ctx).setScale(2,BigDecimal.ROUND_HALF_UP);
-
- }
-
- private NonTerminalExpression getNonTerminalExpression(
- String operation,
- Expressions l,
- Expressions r) {
- if (operation.trim().equals("+")) {
- return new AddExpression(l, r);
- }
- if (operation.trim().equals("-")) {
- return new SubtractExpression(l, r);
- }
- if (operation.trim().equals("*")) {
- return new MultiplyExpression(l, r);
- }
- if (operation.trim().equals("/")) {
- return new DivExpression(l, r);
- }
- return null;
- }
-
-
-
- private String toVaviable(String str){
- char var = 'z';
- StringBuffer tmp = new StringBuffer();
-
- StringTokenizer st = new StringTokenizer(str, "+-*/()", true);
- String ss = null;
- while (st.hasMoreElements()) {
- ss = st.nextToken();
-
- if(isDigital(ss)){
- ctx.assign((var)+"",ss);
- tmp.append((var)+"");
- var--;
- }else{
- tmp.append(ss);
- }
-
- }
-
- return tmp.toString();
- }
-
- private String infixToPostFix(String str) {
- Stack s = new Stack();
- String pfExpr = "";
- String tempStr = "";
-
- String expr = str.trim();
- for (int i = 0; i < str.length(); i++) {
-
- String currChar = str.substring(i, i + 1);
-
- if ((isOperator(currChar) == false)
- && (!currChar.equals("("))
- && (!currChar.equals(")"))) {
- pfExpr = pfExpr + currChar;
- }
- if (currChar.equals("(")) {
- s.push(currChar);
- }
-
- if (currChar.equals(")")) {
- tempStr = (String) s.pop();
- while (!tempStr.equals("(")) {
- pfExpr = pfExpr + tempStr;
- tempStr = (String) s.pop();
- }
- tempStr = "";
- }
-
-
- if (isOperator(currChar)) {
- if (s.isEmpty() == false) {
- tempStr = (String) s.pop();
- String strVal1 = (String) operators.get(tempStr);
- int val1 = new Integer(strVal1).intValue();
- String strVal2 = (String) operators.get(currChar);
- int val2 = new Integer(strVal2).intValue();
-
- while ((val1 >= val2)) {
- pfExpr = pfExpr + tempStr;
- val1 = -100;
- if (s.isEmpty() == false) {
- tempStr = (String) s.pop();
- strVal1 = (String) operators.get(tempStr);
- val1 = new Integer(strVal1).intValue();
-
- }
- }
- if ((val1 < val2) && (val1 != -100))
- s.push(tempStr);
- }
- s.push(currChar);
- }
-
- }
-
- while (s.isEmpty() == false) {
- tempStr = (String) s.pop();
- pfExpr = pfExpr + tempStr;
- }
-
- return pfExpr;
- }
-
- private Expressions buildTree(String expr) {
- Stack s = new Stack();
-
- for (int i = 0; i < expr.length(); i++) {
- String currChar = expr.substring(i, i + 1);
-
- if (isOperator(currChar) == false) {
- Expressions e = new TerminalExpression(currChar);
- s.push(e);
- } else {
- Expressions r = (Expressions) s.pop();
- Expressions l = (Expressions) s.pop();
- Expressions n = getNonTerminalExpression(currChar, l, r);
- s.push(n);
- }
- }
- return (Expressions) s.pop();
- }
-
- private boolean isDigital(String str) {
- if (!isOperator(str) && !ctx.checkKey(str) && !isComma(str))
- return true;
- return false;
- }
-
- private boolean isComma(String str) {
- if ((str.equals("("))
- || (str.equals(")")))
- return true;
- return false;
- }
-
- private boolean isOperator(String str) {
- if ((str.equals("+"))
- || (str.equals("-"))
- || (str.equals("*"))
- || (str.equals("/")))
- return true;
- return false;
- }
-
- public void printVariables(){
- this.ctx.print();
- }
- }
-
- class Context {
-
- private HashMap varList = new HashMap();
-
- public void assign(String var, String value) {
- varList.put(var, new BigDecimal(value));
- }
-
- public BigDecimal getValue(String var) {
- BigDecimal tmp;
- if(varList.get(var) == null){
- tmp = new BigDecimal(var);
- }else{
- tmp = (BigDecimal) varList.get(var);
- }
-
-
-
- return tmp;
- }
-
- public boolean checkKey(String var){
-
- return varList.get(var) == null?false:true;
-
- }
- public void print(){
- Object ob ;
- for(Iterator it = varList.keySet().iterator();it.hasNext();){
- ob = it.next();
- System.out.println(ob+" = "+varList.get(ob));
- }
- }
-
- public Context(HashMap vars) {
- if(vars !=null)
- varList = vars;
- }
-
- }
-
-
- class TerminalExpression implements Expressions {
-
- private String var;
-
- public TerminalExpression(String v) {
- var = v;
- }
-
- public BigDecimal evaluate(Context c) {
- return c.getValue(var);
- }
- }
-
-
- interface Expressions {
- public BigDecimal evaluate(Context c);
- }
-
-
-
- abstract class NonTerminalExpression implements Expressions {
- private Expressions leftNode;
-
- private Expressions rightNode;
-
- public NonTerminalExpression(Expressions l, Expressions r) {
- setLeftNode(l);
- setRightNode(r);
- }
-
- public void setLeftNode(Expressions node) {
- leftNode = node;
- }
-
- public void setRightNode(Expressions node) {
- rightNode = node;
- }
-
- public Expressions getLeftNode() {
- return leftNode;
- }
-
- public Expressions getRightNode() {
- return rightNode;
- }
- }
-
-
-
- class AddExpression extends NonTerminalExpression {
- public BigDecimal evaluate(Context c) {
- return getLeftNode().evaluate(c).add(getRightNode().evaluate(c));
- }
-
- public AddExpression(Expressions l, Expressions r) {
- super(l, r);
- }
- }
-
-
-
- class SubtractExpression extends NonTerminalExpression {
- public BigDecimal evaluate(Context c) {
- return getLeftNode().evaluate(c).subtract(getRightNode().evaluate(c));
- }
-
- public SubtractExpression(Expressions l, Expressions r) {
- super(l, r);
- }
- }
-
-
-
- class MultiplyExpression extends NonTerminalExpression {
- public BigDecimal evaluate(Context c) {
- return getLeftNode().evaluate(c).multiply(getRightNode().evaluate(c));
- }
-
- public MultiplyExpression(Expressions l, Expressions r) {
- super(l, r);
- }
- }
-
-
-
- class DivExpression extends NonTerminalExpression {
- public BigDecimal evaluate(Context c) {
- return getLeftNode().evaluate(c).divide(getRightNode().evaluate(c),4,BigDecimal.ROUND_HALF_UP);
- }
-
- public DivExpression(Expressions l, Expressions r) {
- super(l, r);
- }
-
- }
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
### Java计算器实现Windows计算器大部分功能的关键知识点 #### 1. Java Swing GUI库的应用 - **基础知识**:Swing是Java中的一个用于构建图形用户界面(GUI)的轻量级组件工具包。它允许开发者创建功能丰富的应用程序...
一个比较简单的java计算器,加减乘除功能,不过没有添加注释
java 计算器 实现+ - * / 老师布置的期末考核作业,代码很简短,非常容易看懂
在本项目中,我们主要探讨的是如何使用Java...通过学习这个Java计算器的实现,开发者不仅可以掌握GUI编程的基本技巧,还能了解事件处理、状态机模型和异常处理等核心概念,这些都是Java应用程序开发中的重要组成部分。
在IT领域,可视化JAVA计算器的实现是一个典型的GUI(图形用户界面)编程项目,它涉及到Java的基础知识、Swing或JavaFX库以及事件处理等概念。下面将详细解释这些知识点。 首先,Java是一种广泛使用的面向对象的编程...
总的来说,创建一个简单的Java计算器涉及到了面向对象编程的基本概念、数学运算的实现、异常处理、用户界面设计以及事件处理等多方面知识。通过这个项目,开发者不仅可以巩固Java基础知识,还能提升解决问题的能力。
java 计算器代码 实现简单的应用,适合初学java的人用来参考
【Java计算器实现详解】 在Java编程的学习过程中,创建一个计算器是一项常见的练习任务,它能帮助学生深入理解面向对象编程的概念,以及如何处理用户输入和输出。这个“java计算器”项目,作为期末作业,旨在检验...
java实现计算器的代码java实现计算器的代码java实现计算器的代码java实现计算器的代码java实现计算器的代码java实现计算器的代码java实现计算器的代码java实现计算器的代码java实现计算器的代码java实现计算器的代码...
java 计算器java 计算器java 计算器java 计算器java 计算器java 计算器java 计算器java 计算器java 计算器
在Java编程语言中,实现一个计算器功能涉及到GUI(图形用户界面)的设计以及基本的算术运算处理。...当然,实际的代码会更复杂,需要处理更多的细节,但这个概述提供了一个基本的框架来开始你的Java计算器项目。
在这个“Java计算器实验报告”中,我们探讨了一个基于Java编程语言的计算器应用程序的开发过程。这个实验的主要目标是设计一个用户界面,实现基本的数学运算,包括加法、减法、乘法和除法,同时处理可能出现的异常...
简单的java计算器,swing做界面 实现了四则运算。
这个是计算器的java代码实现。希望能有用处
在本项目中,我们主要探讨如何...通过以上步骤,我们可以逐步构建一个功能完备的Java计算器程序。这个过程将涉及Java语言的基础语法、面向对象编程、异常处理、UI设计等多个方面,是对Java开发者技能的一次全面锻炼。
本项目“用AWT包实现的JAVA计算器”旨在通过AWT来构建一个功能完备的计算器应用。下面将详细介绍这个项目中的关键知识点。 1. **AWT组件**: - AWT提供了各种基本组件,如按钮(Button)、文本字段(TextField)、...
简单Java计算器实现,其中包括了对数据的复制粘贴功能,文档从专业角度撰写,有需求分析、概要设计、详细文档等......希望能给大家带来一点好处。(主要是前阵子看到有个人也在CSDN上面上传了一个关于计算器的文档,...
【Java 计算器实现详解】 在Java编程中,创建一个计算器应用可以帮助初学者理解GUI(图形用户界面)设计和事件处理。以下是对给定文件中`java计算器.java`部分内容的详细解释: 1. **包声明(package)**: `...
我学习JAVA时编的计算器小程序,完全支持键盘输入! 仅供学习交流用!