如何用Java计算数字算式

Sodino 2008-11-29 02:27:48
如何计算:
1 + 2 - (6 * ( 3 -1 * 4 ) - 1) + 2呢?

上面这式子只是个比如,我想着应该先判断括号,再计算括号里的内容,应该要用到递归。

有谁有这方面的实现算法,介绍一下学习学习好吗?

谢谢。。。
...全文
439 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sodino 2008-12-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ujmkoo 的回复:]
楼上的代码计算
1+5*(2+1)*(3+9)+8=188.0 (不正确)

列表内容为:
1.0
5.0
2.0
1.0
+
*
3.0
9.0
+
*
8.0
+
(最后还少一个+)
[/Quote]

谢谢关注
匿名 2008-12-30
  • 打赏
  • 举报
回复
楼上的代码计算
1+5*(2+1)*(3+9)+8=188.0 (不正确)

列表内容为:
1.0
5.0
2.0
1.0
+
*
3.0
9.0
+
*
8.0
+
(最后还少一个+)

ssqtjffcu 2008-11-29
  • 打赏
  • 举报
回复
import java.util.LinkedList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.*;
class OPNode {
char op; //运算符符号
int level; //运算符优先级

public OPNode(String op) {
this.op = op.charAt(0);
//根据不同的运算符号分配优先级
if(op.equals("+")||op.equals("-")) {
this.level = 1; //加减运算优先级为1
}else if(op.equals("*")||op.equals("/")) {
this.level = 2; //乘除运算优先级为2
}else if(op.equals("(")) {
this.level = -3; //"("优先级为-3
}else {
this.level = -1; //")"优先级为-1
}
}
}

//主类
public class Test {
public static void main(String[] args) {
String expression = "1+5*(2+1)";
Pattern entryOfExpression = Pattern.compile("[0-9]+(\\.[0-9]+)?|\\(|\\)|\\+|-|\\*|/");
Deque stack = new LinkedList(); //运算过程中要使用的栈
List list = new LinkedList(); //运算过程中要使用的列表
//用正则式分析表达式
Matcher m = entryOfExpression.matcher(expression);
//对分析出的每个语素处理
while(m.find()) {
String nodeString = expression.substring(m.start(), m.end());
if(nodeString.matches("[0-9].*")) {
list.add(Double.valueOf(nodeString));
}else {
//如果是运算符,根据不同情况处理
OPNode opn = new OPNode(nodeString);
int peekLevel = (stack.peek()==null)?0:((OPNode)stack.peek()).level;
if(opn.level>peekLevel) {
stack.push(opn);
}else {
if(opn.level==-1) {
OPNode tempOpn = (OPNode)stack.pop();
while(tempOpn.level!=-3) {
list.add(tempOpn); //出栈的运算符送列表
tempOpn =(OPNode)stack.pop();
}
}else if(opn.level==-3) {
stack.push(opn); //如果为"("直接入栈
}else {
//如果新运算符比栈顶运算符优先级低则一直出栈
//直到栈空间或新运算符比栈顶运算符优先级高
OPNode tempOpn = (OPNode)stack.pop();
while(tempOpn.level>=opn.level) {
list.add(tempOpn);
if(stack.isEmpty()) break;
tempOpn = (OPNode)stack.pop();
}
stack.push(opn); //新运算符号入栈
}
}
}
}
OPNode tempOpn = null;
//栈中剩余运算符送入列表
while(!stack.isEmpty()) {
tempOpn = (OPNode)stack.pop();
list.add(tempOpn);
}
//后续表达示计算
stack.clear();
for(Object o:list) {
if(o instanceof Double) {
stack.push(o);
}else {
double opd2 = ((Double)stack.pop()).doubleValue();
double opd1 = ((Double)stack.pop()).doubleValue();
switch(((OPNode)o).op) {
case '+':stack.push(opd1 + opd2);break;
case '-':stack.push(opd1 - opd2);break;
case '*':stack.push(opd1 * opd2);break;
case '/':stack.push(opd1 / opd2);break;
}
}
}
//打印计算结果
System.out.println(expression+"="+stack.pop());
}
}

//F:\javatest>java Test
// 1+5*(2+1)=16.0
head_first545 2008-11-29
  • 打赏
  • 举报
回复
用堆栈来实现吧
中文编程系统化教程初级1学习编程捷径:(不论是正在学习编程的大学生,还是IT人士或者是编程爱好者,在学习编程的过程中用正确的学习方法可以达到事半功倍的效果。对于初学者,可以通过下面的方法学习编程,通过对成百上千个实例练习,则很快会成为编程高手。我们专业从事编程十几年,积累了丰富的编程经验,会陆续制作编程视频供大家学习,中级、高级编程我们会专门制作中高级的系列编程课程,难度逐步加深,想学编程的可以关注我们的系列课程。可以就相关编程问题提问。1、【编程工具分为 免费自由版、专业版、企业版。】首先通过免费自由版熟悉基本操作,通过我们提供的实例视频学习编程,先快速入门。2、基本入门后,再学习我们提供的中级编程课程,通过对若干实例的编程练习,基本可以掌握编程思路。3、想继续加深学习的,可以继续学习高级版编程课程,通过对连接数据库等的学习真正开发出实用的商业管理软件或定制开发程序。4、基本掌握了编程思路之后,再学习其他的编程语言或大学里的编程课程则会非常轻松,因为不论是哪个编程语言,最重要的是学习编程思路,而编程思路基本上是相通的。5、学习完PC电脑端编程后,还可以继续学习APP手机软件开发。APP手机软件开发需要有PC电脑上开发基础,操作基本类似。6、编程工具为 搭建之星,这个编程工具的特点:1、安装简单、迅速,纯中文界面,构件丰富,设计过程直观、自由;无需掌握电脑语言,所有编程构件化、命令化、可视化。2、交互式开发,只需要四种类型的“命令”,便可以建立各构件之间的联系;象搭积木一样简单,并可快速的搭建出具有专业水平的软件作品。3、微解释执行,命令解释量小,执行速度快。可以和编译后的可执行文件相媲美。4、提供打包工具,使您即刻将自制软件安装到其它机器上运行。5、自动对开发项目进行加密;使您的项目,在未经授权下,别人无法“浏览、修改”项目的构件关系与搭建方法。课程安排:初级11  初级概述2  熟悉构件取值赋值3 折叠式菜单滑动面板编程4 自定义图形窗口自定义标题栏编程5 多行文本分段显示编程6 调用外部exe文件关闭外部exe文件编程7 给自己编写的项目设置密码8 制作一个计算器编程9 图片浏览编程10 看图软件编程11 配置文件读写编程12密码验证登录编程13软件启动窗口编程14增加软件工具条菜单15调色板编程16随机算式编程17螳螂捕蝉多窗口显示编程18 删除指定的字符行编程19计算表达式编程20扩展系统菜单21时间计算秒级计算编程22数值范围判断编程23数值比较取中间值编程24随机抽取编程25锁定窗口编程26文件拷贝显示进度条编程27项目间传递参数公用数据编程28项目间传递参数执行文件编程29字符串截取编程30多媒体实例澳门介绍编程31电影播放软件编程32初级1总结【使用这个编程工具开发的部分实际案例】   

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧