`
judim
  • 浏览: 41675 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java实现逆波兰式算法(方程式运算)

阅读更多
感谢这位原文网友,原文来自http://blog.csdn.net/yunxiang/article/details/1918717

代码不多只有三个类,第一个是对象类,第二个是解析类(主类,外面就用这个类的接口),第三个是计算类
package expression1;

import java.util.*;

//栈类    
public class Stacks {
private LinkedList list = new LinkedList();
int top = -1;

public void push(Object value) {
top++;
list.addFirst(value);
}

public Object pop() {
Object temp = list.getFirst();
top--;
list.removeFirst();
return temp;

}

public Object top() {
return list.getFirst();
}
}


第二个是解析类(主类,外面就用这个类的接口)

package expression1;

import java.io.*;
import java.util.*;

public class Expression {
private ArrayList expression = new ArrayList();// 存储中序表达式

private ArrayList right = new ArrayList();// 存储右序表达式

private String result;// 结果

// 依据输入信息创建对象,将数值与操作符放入ArrayList中
private Expression(String input) {
StringTokenizer st = new StringTokenizer(input, "+-*/()", true);
while (st.hasMoreElements()) {
String s = st.nextToken();
expression.add(s);
}
}

// 将中序表达式转换为右序表达式
private void toRight() {
Stacks aStack = new Stacks();
String operator;
int position = 0;
while (true) {
if (Calculate.isOperator((String) expression.get(position))) {
if (aStack.top == -1 || ((String) expression.get(position)).equals("(")) {
aStack.push(expression.get(position));
} else {
if (((String) expression.get(position)).equals(")")) {
while (true) {

if (aStack.top != -1 && !((String) aStack.top()).equals("(")) {
operator = (String) aStack.pop();
right.add(operator);
} else {
if (aStack.top != -1)
aStack.pop();
break;
}
}
} else {
while (true) {
if (aStack.top != -1
&& Calculate.priority((String) expression.get(position)) <= Calculate
.priority((String) aStack.top())) {
operator = (String) aStack.pop();
if (!operator.equals("("))
right.add(operator);
} else {
break;
}

}
aStack.push(expression.get(position));
}
}
} else
right.add(expression.get(position));
position++;
if (position >= expression.size())
break;
}
while (aStack.top != -1) {
operator = (String) aStack.pop();
if (!operator.equals("("))
right.add(operator);
}
}

// 对右序表达式进行求值
private void getResult() {
this.toRight();
for (int i = 0; i < right.size(); i++) {
System.out.println(right.get(i));
}
Stacks aStack = new Stacks();
String op1, op2, is = null;
Iterator it = right.iterator();

while (it.hasNext()) {
is = (String) it.next();
if (Calculate.isOperator(is)) {
op1 = (String) aStack.pop();
op2 = (String) aStack.pop();
aStack.push(Calculate.twoResult(is, op1, op2));
} else
aStack.push(is);
}
result = (String) aStack.pop();
it = expression.iterator();
while (it.hasNext()) {
System.out.print((String) it.next());
}
System.out.println("=" + result);
}

public static void main(String avg[]) {
try {
System.out.println("Input a expression:");
BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
for (;;) {
String input = new String();
input = is.readLine().trim();
if (input.equals("q"))
break;
else {
Expression boya = new Expression(input);
boya.getResult();
}
System.out.println("Input another expression or input 'q' to quit:");
}
is.close();
} catch (IOException e) {
System.out.println("Wrong input!!!");
}
}
}

第三个是计算类
package expression1;

public class Calculate {
// 判断是否为操作符号
public static boolean isOperator(String operator) {
if (operator.equals("+") || operator.equals("-") || operator.equals("*") || operator.equals("/")
|| operator.equals("(") || operator.equals(")"))
return true;
else
return false;
}

// 设置操作符号的优先级别
public static int priority(String operator) {
if (operator.equals("+") || operator.equals("-"))
return 1;
else if (operator.equals("*") || operator.equals("/"))
return 2;
else
return 0;
}

// 做2值之间的计算
public static String twoResult(String operator, String a, String b) {
try {
String op = operator;
String rs = new String();
double x = Double.parseDouble(b);
double y = Double.parseDouble(a);
double z = 0;
if (op.equals("+"))
z = x + y;
else if (op.equals("-"))
z = x - y;
else if (op.equals("*"))
z = x * y;
else if (op.equals("/"))
z = x / y;
else
z = 0;
return rs + z;
} catch (NumberFormatException e) {
System.out.println("input has something wrong!");
return "Error";
}
}
}
分享到:
评论

相关推荐

    java实现逆波兰式运算

    1.本例是对数据结构栈的练习 2.本例使用了java类集作为辅助,但不是必要,所有功能都可以自己实现 3.本例有输入四则运算的合法性判断方法,是基于逻辑实现,可以使用正则表达式字符匹配,会是代码简洁不少.

    java带逆波兰式的科学计算器

    本文将深入探讨逆波兰式计算器的原理、实现以及在Java中的应用。 逆波兰式(Reverse Polish Notation, RPN)是由波兰数学家Jan Łukasiewicz提出的,它的特点在于没有括号,运算符总是在其操作数之后。例如,常规...

    编译原理逆波兰式分析法源码

    2. **表达式求值**:对逆波兰式进行从左到右的扫描,遇到数字就压入栈中,遇到运算符时弹出栈顶的两个元素进行运算,然后将结果压回栈中。最终栈中的单个元素就是表达式的值。 在C++编程中,实现逆波兰式分析通常...

    java 逆波兰式(这个是java版的还附有实验报告)

    - **实验三 逆波兰式的转换.doc**:这可能是一个实验报告,详细介绍了实验目的、步骤、结果和结论,可能还包含了Java实现逆波兰式转换的代码示例和测试用例。 - **java逆波兰式.txt**:这份文件很可能是Java程序的源...

    逆波兰式的算法实现程序

    对于逆波兰式的算法实现,我们可以遵循以下步骤: 1. 首先,我们需要创建一个运算符栈。这个栈遵循“越靠近栈顶,优先级越高”的原则。这意味着高优先级的运算符会位于低优先级运算符之上。 2. 接着,我们读入一个...

    逆波兰式 java编写

    逆波兰式 java编写,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

    1. 实验3 逆波兰式的产生及计算-预习提示1

    实验3主要涉及的是逆波兰式(后缀式)的生成与计算,这是计算机科学中一种常见的算法问题,尤其在编译原理和数据结构课程中常见。逆波兰式是一种表达算术表达式的方式,它的特点是运算符写在操作数之后,便于计算机...

    C语言逆波兰式(数据结构)

    C语言作为一种强大的系统级编程语言,常用于实现各种算法和数据结构,包括逆波兰式。 在C语言中实现逆波兰式通常涉及以下几个关键知识点: 1. **栈数据结构**:逆波兰式的核心是栈,它是一种先进后出(FILO)的...

    C#逆波兰式计算器

    逆波兰式计算器的实现涉及了字符串处理、数据结构(栈和队列)、算法(Shunting Yard算法)、操作符优先级管理等多个编程基础知识。掌握这些技能对于C#程序员来说是至关重要的,因为它们不仅适用于逆波兰式计算器,...

    逆波兰式的生成-(代码+原理图)

    逆波兰式生成的原理和实现 逆波兰式是一种后缀表达式,它将操作符写在操作数之后,使得算术表达式的计算变得更加简洁和高效。在计算机科学中,逆波兰式广泛应用于编译器、解释器和计算器等领域。 逆波兰式生成的...

    用MFC写的逆波兰式计算器

    6. **算法实现**:逆波兰式计算的核心算法包括将表达式分解为数字和操作符,将数字压栈,遇到操作符时弹出栈顶的两个元素进行运算。这个过程需要考虑到操作符的优先级和结合性。 7. **错误处理**:在实际应用中,...

    编译原理实验报告6-逆波兰式的翻译和计算.doc

    实现逆波兰式转换,我们可以使用算符优先分析算法,这个算法根据运算符的优先级和结合性来决定何时将运算符压入栈。在这个实验中,我们将读取中缀表达式,例如从文本文件中读取,每个表达式占一行。然后,我们会使用...

    逆波兰式(JAVA版)

    - **算法**:同样使用栈,从左到右读取逆波兰式,遇到数字入栈,遇到操作符则弹出栈顶两个元素进行运算,结果再入栈,直至读完表达式,栈中只剩下一个元素,即为最终结果。 - **实例**:对于逆波兰式 `2 3 4 * +`...

    java编写的逆波兰式转换方法

    逆波兰算法的java版,能够将运算字符串转换为逆波兰式,并尽心简单的错误判断处理!

    C逆波兰式(是用c实现的)

    ### C逆波兰式实现解析 #### 一、逆波兰式简介 逆波兰式,又称后缀表达式,是...综上所述,逆波兰式提供了一种有效的数学表达式处理方式,通过适当的算法和数据结构设计,可以实现对复杂数学表达式的高效解析和计算。

    逆波兰算法实现

    以下是一个简化的Java实现逆波兰算法的代码示例: ```java import java.util.Stack; import java.util.StringTokenizer; public class RPNCalculator { public static double calculate(String s) { Stack...

    编译原理 逆波兰式 C++实现

    总结一下,本主题涵盖了编译原理中的一个重要概念——逆波兰式,以及如何用C++实现中缀表达式到逆波兰式的转换和逆波兰式的计算。通过学习这部分内容,可以深入理解编译器如何处理表达式,这对于编写解释器或编译器...

    逆波兰式的实现

    本篇文章将深入探讨如何实现将中缀表达式转换为逆波兰式,同时确保表达式的运算数始终为一位数。 首先,我们要理解中缀表达式的运算规则,它是我们常见的运算表达式形式,例如 "2 + 3 * 4"。然而,这种形式在计算机...

    编程求取合式公式的波兰式和逆波兰式

    在计算机科学领域,波兰式(也称为前缀表示法)和逆波兰式(也称为后缀表示法)是表达算术或逻辑公式的不同...通过理解和使用这个程序,用户不仅可以了解波兰式和逆波兰式,还能深入理解解析算法和栈数据结构的应用。

    逆波兰式的生成

    通过阅读提供的“逆波兰式的生成.txt”文件,你可以深入了解如何用Java实现这个转换过程,包括如何处理运算符的优先级、括号和表达式的复杂情况。文件中可能包含详细的代码示例,解释每一步的操作,并提供测试用例以...

Global site tag (gtag.js) - Google Analytics