资源简介
JAVA数据结构复杂表达式求值

代码片段和文件信息
/*中南大学软件学院陈祖煌2013-12-01*/
/*程序实现原理:
* 1.将用户输入的表达式利用栈来转换为后缀式,例:2+4*(2-2)变为后缀式则是2;4;2;2;-;*;+
* 2.然后直接计算后缀式计算方法是2;4;2;2;-;*;+ --→ 2;4;0;*;+ --→ 2;0;+ ---→ 2
* 3.如果有单词运算,例如abs(-10.01)等,则先将abs(-10.01)算出来,然后将结果代回原表达式中,执行1、2步即可。
*/
import javax.swing.*;
import java.util.*;
import java.util.regex.*;
public class Caculator {
NumberList number;
CharList mychar;
public Caculator(){
number = new NumberList(); //新建一个数字栈
mychar = new CharList(); //新建一个符号栈
}
//主函数,程序入口
public static void main(String[] args){
Scanner sc = new Scanner(System.in); //从键盘读入表达式
System.out.println(“请务必正确输入表达式例如: 1.8+abs(-0.2)+exp(0)+sin(90)+ln(1)+log10(1000)*(-1+4)“);
System.out.print(“请输入表达式:“);
String express = sc.nextLine(); //用户输入的表达式
Caculator ca = new Caculator(); //new一个Caculator类
String behind = ca.toBehind(express+“#“); //用Caculator对象的toBehind函数将表达式转换为后缀式
System.out.println(“结果为:“ + ca.caculate(behind)); //用caculate方法将后缀式计算出来,并输出结果
}
//将参数express表达式转换为后缀式,返回这个后缀式
public String toBehind(String express){ //把表达式变成后缀式
express = deal(express); //进行符号运算处理
//对express的负号识别处理操作
if(express.charAt(0) == ‘-‘){ //如果第符号在串首的地方,则在前面加0
express = “0“ + express;
}
for(int i = express.length()-1; i >= 1; i--){ //如果负号前面是括号,则在前面加0
if(express.charAt(i) == ‘-‘ && express.charAt(i-1) == ‘(‘){
express = express.substring(0 i) + “0“ + express.substring(i);
}
}
String behind = new String();
mychar.push(‘#‘); //把‘#‘放到栈底
for(int i = 0; i < express.length(); i++){ //遍历express表达式字符串每一个字符
if( (express.charAt(i)<=57 && express.charAt(i)>=48) || express.charAt(i) == ‘.‘){ //如果此字符是数字或小数点则输出到后追式
behind += express.charAt(i);
}
else if(express.charAt(i) == ‘#‘){ //如果是表达式结束符
while(mychar.top != 1){ //从栈顶依次弹出所有运算符,并加到后缀式
behind += (“;“ + mychar.pop());
} //循环完成后,已经得到想要的后缀式了
}
else{ //如果是操作符,则用分号隔开,以便把几个表示同一个数字的字符变为double型
behind += “;“;
if( Osp(express.charAt(i)) > Isp(mychar.top()) ){ //如果express.charAt(i)比栈顶字符优先级高则入栈
mychar.push(express.charAt(i));
}
else if( Osp(express.charAt(i)) == Isp(mychar.top()) ){ //如果和栈顶操作符优先级相等,则是右括号与左括号匹配的情况,应把左括号扔掉
mychar.pop();
}
else{ //如果比栈顶字符优先级低则弹出栈顶元素加入后缀式中,直至栈顶元素优先级比其低时就入栈
boolean higher = false;
while (!higher){
behind += (mychar.pop() + “;“);
if( Osp(express.charAt(i)) > Isp(mychar.top())){
higher = true;
mychar.push(express.charAt(i));
}
else if( Osp(express.charAt(i)) == Isp(mychar.top()) ){ //
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 13991 2014-01-03 13:51 Caculator.java
相关资源
- 微博系统(Java源码,servlet+jsp),适
- java串口通信全套完整代码-导入eclip
- JNA所需要的jar包
- jsonarray所必需的6个jar包.rar
- 三角网构TIN生成算法,Java语言实现
- utgard用到的jar包
- java代码编写将excel数据导入到mysql数据
- Java写的cmm词法分析器源代码及javacc学
- JAVA JSP公司财务管理系统 源代码 论文
- JSP+MYSQL旅行社管理信息系统
- commons-beanutils-1.8.3.jar
- 推荐算法的JAVA实现
- 基于Java的酒店管理系统源码(毕业设
- java-图片识别 图片比较
- android毕业设计
- ehcache-core-2.5.1.jar
- android-support-v4.jar已打包进去源代码
- java23种设计模式+23个实例demo
- java Socket发送/接受报文
- JAVA828436
- java界面美化 提供多套皮肤直接使用
- 在线聊天系统(java代码)
- 基于Java的图书管理系统807185
- java中实现将页面数据导入Excel中
- java 企业销售管理系统
- java做的聊天系统(包括正规课程设计
- Java编写的qq聊天室
- 商店商品管理系统 JAVA写的 有界面
- JAVA开发聊天室程序
- 在linux系统下用java执行系统命令实例
评论
共有 条评论