逆波兰式求值.请求高手帮助!!!!!!!!!!!!!!!!

ruir 2006-11-16 04:51:08
http://www.cnxuexi.com/computer/chengxusheji/Java/4297.html

package expression;
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("-")||operator.equals("(")) return 1;
else if(operator.equals("*")||operator.equals("/")) return 2;
else return 0;
}
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";
}
}
}





package expression;
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 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!!!");
}
}
}


算(2+2*3)/2 就有问题,算错了.请高手指点一下为什么.将代码改一下.谢谢!!!
...全文
167 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruir 2006-11-16
  • 打赏
  • 举报
回复
嗯,貌似改对了.测试中......
谢谢楼上!
hbwhwang 2006-11-16
  • 打赏
  • 举报
回复
另一个地方是:

if(temp.equals(")")){
/*if(!((String)aStack.top()).equals("(")){
operator=(String)aStack.pop();
right.add(operator);
}*/
operator=(String)aStack.pop();
while (!operator.equals("(")) {
right.add(operator);
operator=(String)aStack.pop();
}
hbwhwang 2006-11-16
  • 打赏
  • 举报
回复
一个地方是
public static int priority(String operator){
if(operator.equals("+")||operator.equals("-")) return 1;
else if(operator.equals("*")||operator.equals("/")) return 2;
else return 0;
}
hbwhwang 2006-11-16
  • 打赏
  • 举报
回复
该你改了一下,貌似改对了。改了2个地方

package com.unnamed.training.ibatis.ex1.test;

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

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;
}
public static String twoResult(String operator,String a,String b){
System.out.println(operator+","+a+","+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";
}
}
}

class Stacks{
private LinkedList list=new LinkedList();
int top=-1;
public void push(Object value){
top++;
list.addFirst(value);
System.out.println("push:"+value);
}
public Object pop(){
Object temp=list.getFirst();
top--;
list.removeFirst();
System.out.println("pop:"+temp);
return temp;

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



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);
String temp;
while(st.hasMoreElements()){
temp=st.nextToken();
//System.out.println(temp);
expression.add(temp);
}
}
//将中序表达式转换为右序表达式
private void toRight(){
Stacks aStack=new Stacks();
String operator;
int position=0;
while(true){
String temp=(String)expression.get(position);
if(Calculate.isOperator(temp)){
if(aStack.top==-1||temp.equals("(")){
aStack.push(temp);
} else{
if(temp.equals(")")){
/*if(!((String)aStack.top()).equals("(")){
operator=(String)aStack.pop();
right.add(operator);
}*/
operator=(String)aStack.pop();
while (!operator.equals("(")) {
right.add(operator);
operator=(String)aStack.pop();
}
} else{
if(Calculate.priority(temp)<=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();
System.out.println(right);
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!!!");
}
}
}
haisenmai 2006-11-16
  • 打赏
  • 举报
回复
mark
ruir 2006-11-16
  • 打赏
  • 举报
回复
请对算法感兴趣的高手相助!!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧