• 大小: 3KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-01
  • 语言: Java
  • 标签: 数据结构  java  

资源简介

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

评论

共有 条评论