java 代码
package expression;
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()) {
expression.add(st.nextToken());
}
}
// 将中序表达式转换为右序表达式
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(")")) {
if (!((String) aStack.top()).equals("(")) {
operator = (String) aStack.pop();
right.add(operator);
}
} else {
if (Calculate.priority((String) expression
.get(position)) <= Calculate
.priority((String) aStack.top())
&& aStack.top != -1) {
operator = (String) aStack.pop();
if (!operator.equals("("))
right.add(operator);
}
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();
right.add(operator);
}
}
// 对右序表达式进行求值
private void getResult() {
this.toRight();
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!!!");
}
}
}
本文转自 ☆★ 包罗万象网 ★☆ - http://www.baoluowanxiang.com 转载请注明出处,侵权必究!
原文链接:http://www.baoluowanxiang.com/a/program/java/2010/0528/906.html
分享到:
相关推荐
逆波兰式 java编写,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
java 逆波兰式 (这个是java版的 还附有实验报告)
编译原理逆波兰式源代码,下载就能打开,打开.dsw文件。基于c++
逆波兰算法的java版,能够将运算字符串转换为逆波兰式,并尽心简单的错误判断处理!
课程作业,使用逆波兰式算法,使用MFC
本人的编程能力不是很强 大三用java编写的逆波兰式计算器 费了一些牛劲儿 可以实现一定的负数和减号的区别,但是有一种-(A+B)的功能不能实现 希望哪个编程高手能完善一下
将一个普通的中序表达式转换为逆波兰表达式的一般算法是: 1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。 (2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的...
C语言逆波兰式(数据结构),用vc写的,可以试试
计算器实现了基本的运算功能,可做表达式计算,以逆波兰式运算
编译原理中的中间语言翻译器的构造所使用的将一个表达式转换为逆波兰式的算法实现,我用的是vc++6.0写的,程序挺简单的
这是严蔚敏《数据结构》配套习题册上的题目:将逆波兰式转换成波兰式,并提示错误(作为简化,只处理"+-*/"和0~9的数字)。... 算法是根据后根遍历的序列构造一个表达式树,进而先根遍历此树获得波兰式表达式。
逆波兰式是编译原理中的重点知识。 利用逆波兰式生成算法编写程序,将从键盘上输入的算法表达式(中缀表达式)转化成逆波兰式。 这个是C++版的逆波兰式
JAVA版的逆波兰式
逆波兰式的翻译和计算。编译原理的实验报告,有利于新手对于逆波兰的基础理解。文件中给出了具体的代码和理解,还有结果截图显示。采用C语言编写,简单易懂。就一个实验报告!!
3.设计出模块结构、测试数据,初步编制好程序 2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好) 3.对学有余力的同学,测试用的表达式事先放在文本
字符串公式解析器,C#使用“逆波兰式算法”
语法制导把表达式翻译成逆波兰式,用c语言实现,通过VC编译
(编译原理)逆波兰式算法的源代码.doc
1.本例是对数据结构栈的练习 2.本例使用了java类集作为辅助,但不是必要,所有功能都可以自己实现 3.本例有输入四则运算的合法性判断方法,是基于逻辑实现,可以使用正则表达式字符匹配,会是代码简洁不少.
编译原理逆波兰算法编译原理逆波兰算法编译原理逆波兰算法编译原理逆波兰算法