资源简介
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实现逻辑回归算法(LogRegression)对
- JAVA+MySQL学生成绩管理系统
- java2word程序代码及jar包
- JAVAWeb外文文献翻译
- java音频开发.mp3文件解码jmp123.jar
- 某智Java图书管理系统,视频,代码
- java 使用jacob Word转PDF 完美格式
- sqljdbc4-4.0.jar
- 银行系统server数据库
- 带人工智能的五子棋java源程序
- java混淆jocky,不限jdk版本
-
gba
se-connector-java-8.3.81.53-build52.8-bi - java编写整合操作系统五个算法
- iso8583协议的java实现
- Java Socket编写的教学管理系统(简易版
- JAVA写的编译器编译原理课设
- \“java实现简单的单点登录\“源码包
- 学生选课管理系统JAVA+SQL
- Eclipse Java注释模板
- modbus4j-3.0.4-SNAPSHOT.jar
- java高校就业管理系统源码
- Mongodb + GridFS +Java 操作Mongodb中存储的
- 基于MyEclipse开发的超市管理系统
- java web静态网页制作代码
- java编写的宠物医院管理系统
- wordcount.jar
- Java语言程序设计课后习题解答+张思民
- java sound 简单播放器代码
- java写的方向键盘控制的简易画图工具
- JAVA编写的驾校在线考试系统
评论
共有 条评论