77范文网 - 专业文章范例文档资料分享平台

Java计算器实现(逆波兰式)

来源:网络收集 时间:2018-12-04 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

package hfw.util;

import java.util.ArrayDeque; import java.util.Deque; /** *

*逆波兰式

*总结,java版的Eval:逆波兰和动态编译,推荐用动态编译,因为逆波兰式不认识\4\,只认识\ *@author zyh */

public class RNP { /**

* 运算数 */

private static Deque operationNum = new ArrayDeque(); /**

* 运算符 */

private static Deque operator = new ArrayDeque(); /**

* 将表达式转换为逆波兰式 * @param expression * @return */

private static void str2Rnp(String expression){ operationNum.clear(); operator.clear(); int index = 0; for(int i=0;i

//区分负号和减号,如果'-'前面的一个是+-*/( 认为是负号,'-'前面的是数或)if(c=='-'){ int in = i; while((expression.charAt(in-1)) ==' '){ in--; if(in==0){ break; }

认为是减号

} if(in==0){ continue; } String previous = expression.substring(in-1,i); if(isOperator(previous.charAt(0)) || previous.charAt(0)=='('){ continue; } }

if(operationNum.trim().length()>0){ RNP.operationNum.push(operationNum.trim()); }

index = i+1;

String operator = c+\

//如果操作符是'(',直接入栈 if('('==c){ RNP.operator.push(operator);

//如果操作符是')',将'('操作符之后的全部出栈,入栈操作数,'(' ')'舍弃

}else if(')'==c){ while(true){ String o = RNP.operator.pollFirst(); if(o==null || \ break; } RNP.operationNum.push(o); } //如果操作符是+-*/ }else{ String o = RNP.operator.peekFirst(); if(o== null){//如果操作符栈为空,操作符直接入栈 RNP.operator.push(operator); }else { char operator2 = o.charAt(0); //比较操作符,和操作符栈首的大小,如果操作符大,直接入栈 if(operator2=='(' || operator2==')' || orderOperator(c,operator2)){ RNP.operator.push(operator); //如果操作符栈首大,将操作符栈小于操作符的全部出栈,入栈操作数,最后改操作符入栈 }else{ while(true){ if(o==null || o.charAt(0) =='('|| o.charAt(0) ==')'){ break; } if(orderOperator(c, o.charAt(0))){

break; } o = RNP.operator.pollFirst(); RNP.operationNum.push(o); o = RNP.operator.peekFirst(); } RNP.operator.push(operator); } } } } } String operationNum = expression.substring(index); if(operationNum.trim().length()>0){ RNP.operationNum.push(operationNum.trim()); } while(RNP.operator.size()>0){ RNP.operationNum.push(RNP.operator.pollFirst()); } // RNP.operationNum.addAll(RNP.operator); } //判断一个字符是否为运算符

private static boolean isOperator(char c) { return c=='+' || c=='-' || c=='*' || c=='/'; }

//判断运算符顺序,true表示运算符operator1>operator2,false表示相等或小于 private static boolean orderOperator(char operator1, char operator2){ if((operator1=='*' || operator1=='/') && (operator2=='+' || operator2=='-')){ return true; } return false; } /** * 计算逆波兰式的值 * @return */

private static double countRnp(){ while(RNP.operationNum.size()>0){ String s = RNP.operationNum.pollLast(); //如果是操作符,取出栈顶的两个操作数,直接运算 char operator = s.charAt(0); if(s.length()==1 && isOperator(operator)){ String a = RNP.operator.pollFirst(); String b = RNP.operator.pollFirst();

} /**

if('+'==operator){ double result = Double.parseDouble(b)+Double.parseDouble(a); RNP.operator.push(result+\}else if('-'==operator){ double result = Double.parseDouble(b)-Double.parseDouble(a); RNP.operator.push(result+\}if('*'==operator){ double result = Double.parseDouble(b)*Double.parseDouble(a); RNP.operator.push(result+\}if('/'==operator){ double result = Double.parseDouble(b)/Double.parseDouble(a); RNP.operator.push(result+\}

//如果是操作数,入栈 }else{ RNP.operator.push(s); } }

double result = Double.parseDouble(RNP.operator.pollLast()); return result;

* 计算逆波兰式的值(整数) * @return */

private static int intRnp(){ while(RNP.operationNum.size()>0){ String s = RNP.operationNum.pollLast(); //如果是操作符,取出栈顶的两个操作数,直接运算 char operator = s.charAt(0); if(s.length()==1 && isOperator(operator)){ String a = RNP.operator.pollFirst(); String b = RNP.operator.pollFirst(); if('+'==operator){ int result = Integer.parseInt(b)+Integer.parseInt(a); RNP.operator.push(result+\ }else if('-'==operator){ int result = Integer.parseInt(b)-Integer.parseInt(a); RNP.operator.push(result+\ }if('*'==operator){ int result = Integer.parseInt(b)*Integer.parseInt(a); RNP.operator.push(result+\ }if('/'==operator){ int result = Integer.parseInt(b)/Integer.parseInt(a);

RNP.operator.push(result+\ } //如果是操作数,入栈 }else{ RNP.operator.push(s); } } int result = Integer.parseInt(RNP.operator.pollLast()); return result; } /**

* 计算表达式的值 * @param expression * @return */

public static double calculate(String expression){ try{ str2Rnp(expression); return countRnp(); }catch(Exception e){ e.printStackTrace(); System.out.println(\请检查表达式\ return 0.0; } } /**

* 计算表达式的值(整数) * @param expression * @return */

public static int intCalculate(String expression){ try{ str2Rnp(expression); return intRnp(); }catch(Exception e){ e.printStackTrace(); System.out.println(\请检查表达式\ return 0; } }

public static void main(String[] args) { String s= \ System.out.println(RNP.calculate(s));

}

}

s = \ -2) * -4)-9*( -1 + 2)\System.out.println(RNP.intCalculate(s));

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Java计算器实现(逆波兰式)在线全文阅读。

Java计算器实现(逆波兰式).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/340748.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: