import java.util.EmptyStackException;

import java.util.Stack;

public class CaculateFunction {

private static String[] TrnsInToSufix(String IFX)// PFX放后缀表达式,IFX为中缀表达式

{

String PFX[] = new String[IFX.length()];

StringBuffer numBuffer = new StringBuffer();// 用来保存一个数的

Stack s = new Stack();// 放操作符

String a;

s.push("=");// 第一个为等号

int i = 0, j = 0;

char ch;

for (i = 0; i < IFX.length();) {

ch = IFX.charAt(i);

switch (ch) {

case '0':

case '1':

case '2':

case '3':

case '4':

case '5':

case '6':

case '7':

case '8':

case '9':

while (Character.isDigit(ch) || ch == '.')// 拼数

{

numBuffer.append(ch); // 追加字符

ch = IFX.charAt(++i);

}

PFX[j++] = numBuffer.toString();// break;

numBuffer = new StringBuffer(); // 清空已获取的运算数字

continue; // 这里要重新循环,因为i已经增加过了

case '(':

s.push("(");

break;

case ')':

while (s.peek() != "(")

PFX[j++] = s.pop();

break;

case '+':

case '-':

while (s.size() > 1 && s.peek() != "(")

PFX[j++] = s.pop();

a = String.valueOf(ch);

s.push(a);

break;

case '*':

case '/':

while (s.size() > 1 && (s.peek() == "*") || s.peek() == "/"

|| s.peek() == "s" || s.peek() == "c"

|| s.peek() == "t" || s.peek() == "^"

|| s.peek() == "√")

// 优先级比较,与栈顶比较,

PFX[j++] = s.pop();// 当前操作符优先级大于等于栈顶的弹出栈顶

a = String.valueOf(ch);

s.push(a);

break;

case 's':

case 'c':

case 't':// 三角函数

while (s.size() > 1

&& (s.peek() == "s" || s.peek() == "c"

|| s.peek() == "t" || s.peek() == "^" || s

.peek() == "√"))

// 优先级比较,与栈顶,大于等于的弹出

PFX[j++] = s.pop();

a = String.valueOf(ch);

s.push(a);

break;

case '^':// 幂

case '√':// 开方

while (s.size() > 1 && (s.peek() == "^" || s.peek() == "√"))

PFX[j++] = s.pop();

a = String.valueOf(ch);

s.push(a);

break;

}

i++;

}

while (s.size() > 1)

PFX[j++] = s.pop();

PFX[j] = "=";

return PFX;

}

public static String Evaluate(String IFX)// 后缀表达式求值

{

String PFX[] = null;

try {

PFX = TrnsInToSufix(IFX);

} catch (EmptyStackException e) {

return "syntax error";

}

int i = 0;

double x1, x2, n;

String str;

Stack s = new Stack();

while (PFX[i] != "=") {

str = PFX[i];

switch (str.charAt(0)) {

case '0':

case '1':

case '2':

case '3':

case '4':

case '5':

case '6':

case '7':

case '8':

case '9':

s.push(str);

break;

case '+':

x1 = Double.parseDouble(s.pop());

x2 = Double.parseDouble(s.pop());

n = x1 + x2;

s.push(String.valueOf(n));

break;

case '-':

x1 = Double.parseDouble(s.pop());

x2 = Double.parseDouble(s.pop());

n = x2 - x1;

s.push(String.valueOf(n));

break;

case '*':

x1 = Double.parseDouble(s.pop());

x2 = Double.parseDouble(s.pop());

n = x1 * x2;

s.push(String.valueOf(n));

break;

case '/':

x1 = Double.parseDouble(s.pop());

x2 = Double.parseDouble(s.pop());

n = x2 / x1;

s.push(String.valueOf(n));

break;

case 's':

x1 = Double.parseDouble(s.pop());

n = Math.sin(x1 * Math.PI / 180);

s.push(String.valueOf(n));

break;

case 'c':

x1 = Double.parseDouble(s.pop());

n = Math.cos(x1 * Math.PI / 180);

s.push(String.valueOf(n));

break;

case 't':

x1 = Double.parseDouble(s.pop());

n = Math.tan(x1 * Math.PI / 180);

s.push(String.valueOf(n));

break;

case '√':

x1 = Double.parseDouble(s.pop());

n = Math.sqrt(x1);

s.push(String.valueOf(n));

break;// 开方

case '^':

x1 = Double.parseDouble(s.pop());

x2 = Double.parseDouble(s.pop());

n = Math.pow(x2, x1);

s.push(String.valueOf(n));

break;

}

i++;

}

String result = s.pop();

return result;

}

public static void main(String args[]) {

System.out.println(Evaluate("(31 + 21) * 51 - (21 + 33) / 2 = "));

}

}

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com

特别注意:本站所有转载文章言论不代表本站观点!

本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

java的算术表达式程序,java计算数学表达式相关推荐

  1. java 简单的计算器程序,Java 简易计算器程序

    最近开始学习java,参考教科书写了一个简单的计算器程序,贴上来,以便有用的时候可以参考. 呵呵,哈哈!!! import java.awt.Container; import java.awt.Fl ...

  2. java多客户端聊天程序,java – 多客户端聊天程序,向所有客户端广播聊天?

    我正在尝试制作一个可以容纳多个客户端的非常简单的聊天程序.我有一个多线程服务器,可以连接多个客户端,但服务器只与单个客户端通信(因为它应该,每个客户端都在自己的线程上)我需要帮助让服务器发送来自所有连 ...

  3. Java数字包装类基本程序,Java基本数据类型包装类

    基础数据类型包装类 当一个程序要求交互式输入一个int类型的年龄时,从文本框中输入的结果肯定是String类型的.要在程序中进行相关操作,它必须先转换为int类型.因此可以使用数据类型的转换或强制转换 ...

  4. java能调用python吗_如何使用运行时在Java中调用python程序 - java

    我想用来自Java的参数调用python程序.但是我的输出是空白.代码在这里. Python代码在这里: import sys print(sys.argv[1]) Java代码在这里: public ...

  5. JAVA日历窗口小程序,Java日历的小程序

    Java写的日历小程序,算法效率虽然不算很高,却是简单实用的 CalendarBean.java import java.util.Calendar; public class CalendarBea ...

  6. java万能万年历的程序,java 实现万年历

    以前初学java写万年历,都是采用基本的算法求出是否闰年闰月 计算公式如下 int year = 2014, month = 8, total = 0; if (month == 1 || month ...

  7. java实现表白小程序——java小程序

    今天闲来无事,教大家一个哄妹子的小case.我们需要创建一个心形图案,按照心形图案的位置和长度,对所创建的字符串进行截断并在所需的位置上输出,最终能呈现在屏幕上满满的爱心.废话不多说,直接上源码看效果 ...

  8. java ee的小程序_Java EE调度程序

    java ee的小程序 Java EE应用程序服务器具有本机调度支持,并且在大多数应用程序中,不需要包括外部依赖项,例如著名的Quartz调度程序库. Java EE 6和7完整配置文件上提供的Jav ...

  9. JAVA调用C语言程序

    JAVA调用C语言程序 JAVA调用C语言程序 1. 编写带有native声明的方法的Java类 2. 使用javah 生成:jniSample.h的头文件 3. 使用C实现本地sum方法:(这里我生 ...

最新文章

  1. MySQL主从的一致性校验及修复
  2. Fundamental Research:根系分泌物通过调控土壤微生物影响碳周转的机理
  3. FPGA的历史、现状和未来
  4. mysql用户权限设置
  5. Image Cloud Gallery
  6. 【Python】多种方式实现生成验证码
  7. Python 简单入门学习笔记
  8. java类的加载机制
  9. window下遍历并修改文件
  10. Feign 超时设置
  11. java判断字符串是否是空格_检查字符串在Java中是否为空格,空(“”)或null
  12. codeforces round #257 div2 C、D
  13. 2022-2027年中国新能源汽车功率电子行业市场全景评估及发展战略规划报告
  14. Linux安装文件报错configure: error: no acceptable C compiler found in $PATH
  15. ERROR: ld.so: object ‘/usr/local/lib/libc2.28.so‘ from /etc/ld.so.preload cannot be preloaded ...
  16. OTN 设备基本组成介绍
  17. 倍福--电子凸轮表绘制
  18. SSH免密失败并报错:no mutual signature algorithm
  19. 【100 种语言速成】第 4 节:Lua
  20. Mac OS无法进入系统/数据备份/重装系统方法步骤

热门文章

  1. 实战SpringMVC+Mybatis搭建高性能安全站点
  2. yum 安装 phpmyadmin
  3. QMake Automatic Dependencies
  4. 使用Apache Tomcat Maven插件部署运行 Web 项目
  5. C#实现简单的 Ping 的功能,用于测试网络是否已经联通
  6. 手机游戏赚钱到底有多难?接入运营商或需一年
  7. Silverlight 5 新特性
  8. 餐厅数据分析报告_如何使用数据科学选择理想的餐厅设计场所
  9. 停止使用p = 0.05
  10. 算法 从 数中选出_算法可以选出胜出的nba幻想选秀吗