一个简单的表达式求值类,java

import java.util.Date;
public class testcalc2
{
String a;
int len_of_str;
int err; //err 用于发现哪个字符是出错字符就是第一个出错字符串的下标,初始值为-1,表示无错
int index;

public testcalc2(String str)
{
a = str + "+";
len_of_str = a.length();
err = -1;
index = 0;
System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%% " + a + len_of_str);

}

public double getnextnum()
{
int preindex = index, countofdot = 0;
if(a.charAt(index) == '-')
index++;
if(!Character.isDigit(a.charAt(index)))
{
err = index;
return 0;
}
while((index < len_of_str) &&
(Character.isDigit(a.charAt(index)) || a.charAt(index) == '.'))
{
if(a.charAt(index) == '.')
{
countofdot++;
}
index++;
if(countofdot == 2)
{
err = index;

return 0;
}
}
return Double.valueOf(a.substring(preindex, index)).doubleValue();
}
public char getnextop()
{
char ch = a.charAt(index);
if((ch != '+') && (ch != '-') && (ch != '*') && (ch != '/'))
{
err = index;
ch = ' ';
return ch;
}
index++;
return ch;

}
public double calcuvalue()
{
long start = System.currentTimeMillis();
Date d = new Date();
long now = d.getTime(), dif;
char ch;
boolean minusflag = false, multiflag = false, dividflag = false;
double total = 0, next = 0, num = 0; //next used to be * or /
while(index < len_of_str)
{
num = getnextnum();
if(err != -1)
{
System.out.println("err!?! try to getnextnum but " +
" the char at index " + err + " is wrong ");
return 0;
}
System.out.println("index after " + index);

ch = getnextop();
if(err != -1)
{
System.out.println("err!?! try to getnextop but " +
" the char at index " + err + " is wrong ");
return 0;
}
System.out.println("index after " + index);

switch (ch)
{
case '+':

if(multiflag)
{
next = next * num;
}
else if(dividflag)
{
next = next / num;
}
else
{
next = num;
}
if(minusflag)
{
next = -next;
}
total = total + next;
minusflag = false;
multiflag = false;
dividflag = false;
break;
case '-':
if(multiflag)
{
next = next * num;
}
else if(dividflag)
{
next = next / num;
}
else
{
next = num;
}
if(minusflag)
{
next = -next;
}
total = total + next;
minusflag = true;
multiflag = false;
dividflag = false;
break;
case '*':
if(multiflag)
{
next = next * num;
}
else if(dividflag)
{
next = next / num;
}
else
{
next = num;
}
multiflag = true;
dividflag = false;
break;

case '/':
if(multiflag)
{
next = next * num;
}
else if(dividflag)
{
next = next / num;
}
else
{
next = num;
}
dividflag = true;
multiflag = false;
break;
default: //impossible ,already has err
}
System.out.println("ch " + ch + " num " + num + " total " + total +
" next " + next + " -" + minusflag + " *" +
multiflag + " /" + dividflag);
} //while

return total;

}

时间: 2024-09-12 14:23:17

一个简单的表达式求值类,java的相关文章

简单的表达式求值

一直很想做个比Windows自带的高级一点的计算器,能将整个表达式输入,然后求值.这个程序要求读者具备编译原理的一些知识.举个实例来说明程序处理过程.假设要求值的表达式为 : -25*(56+15)# (其中#号作为表达式结束标志). 首先对表达式进行词法分析,允许出现的字符为: {0 ,1, 2 ,3 ,4 ,5 ,6, 7 ,8, 9 . ,+ ,-, *, / ,( ,),#} 分析的结果产生两种类型的单词:操作符和操作数. 操作符包括: {+, - ,* ,/ ,( ,)} 操作数包括:

c语言栈-栈的问题,用栈编写一个算术表达式求值

问题描述 栈的问题,用栈编写一个算术表达式求值 用栈做一个简单的算术运算,我觉得思想没问题,可是编译不过去,上网找了很多资料,觉得是栈的基本操作有问题,初始化有问题,可具体是什么错误我也不是很了解,求大神指教!! #include #include typedef struct { int data[100]; int top1; }SqStack1; typedef struct { char suanfu[100]; int top2; }SqStack2; SqStack1 shuzi;

java实现任意四则运算表达式求值算法_C 语言

本文实例讲述了java实现任意四则运算表达式求值算法.分享给大家供大家参考.具体分析如下: 该程序用于计算任意四则运算表达式.如 4 * ( 10 + 2 ) + 1 的结果应该为 49. 算法说明: 1. 首先定义运算符优先级.我们用一个 Map<String, Map<String, String>> 来保存优先级表.这样我们就可以通过下面的方式来计算两个运算符的优先级了: /** * 查表得到op1和op2的优先级 * @param op1 运算符1 * @param op2

问题求助 数据结构-使用双栈实现中缀表达式求值一个字符栈一个数字栈

问题描述 使用双栈实现中缀表达式求值一个字符栈一个数字栈 程序写好没输出啊,急求啊......主要BUG 在Nibolansuanfa()这个自定义函数里面前面的可以忽略..... /*核心函数*/ double Nibolansuanfa(char *str,stack *s) { initstack(&s);//初始化栈 char st[20],tc,xy;//st[20]里面放数字字符串 int j=0,i=0,yxcount=0; double d; while(str[j]!='')

浅谈C/C++ 语言中的表达式求值_C 语言

经常可以在一些讨论组里看到下面的提问:"谁知道下面C语句给n赋什么值?" m = 1; n = m+++m++; 最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4,而不是4和5: a = 4; cout << a++ << a; C++ 不是规定 << 操作左结合吗?是C++ 书上写错了,还是这个系统的实现有问题? 注:运行a = 4; cout << a++ << a; 如在Visua

轻量级高性能的表达式求值器——aviator发布2.0

    aviator是一个轻量级的.高性能的Java表达式求值器,主要应用在如工作流引擎节点条件判断.MQ中的消息过滤以及某些特定的业务场景.     自从上次发布1.0后,还发过1.01版本,不过都没怎么宣传.这次发布一个2.0的里程碑版本,主要改进如下: 1.完整支持位运算符,与java完全一致.位预算符对实现bit set之类的需求还是非常必须的. 2.性能优化,平均性能提升100%,函数调用性能提升200%,最新的与groovy和JEXL的性能测试看这里 http://code.goo

MYSQL表达式求值和MYSQL类型转换

    2.4 表达式求值和类型转换    MySQL允许编写包括常量.函数调用和表列引用的表达式.这些值可利用不同类型的运算符进行组合,诸如算术运算符或比较运算符.表达式的项可用圆括号来分组.表达式在SELECT 语句的列选择列表和WHERE 子句中出现得最为频繁,如下所示:    所选择的每列给出了一个表达式,如WHERE 子句中所示的那样.表达式也出现在DELETE 和UPDATE语句的WHERE 子句中,以及出现在INSERT 语句的VALUES( ) 子句中.    在MySQL遇到一

后缀表达式求值及校验

摘要: 本程序是一个完整的后缀表达式计算,主要用栈的操作实现,本程序封装了CStack类实现栈的操作,本程序最大的特色在于运用动态监视表达式的算法对表达式进行数据校验,对一切合法的表达式进行计算,检验出所有任何非法表达式并提示. 关键字:后缀表达式,校验 题目:后缀表达式求值. 要求:输入后缀表达式,输入为整数和四则运算,输出计算结果. 例如: 输入:2 3 * 1 - 输出:5 分析:2*3-1=5 输入:1 2 + 5 4 * 3 - * 6 - 输出:45 分析:(1+2)*(5*4-3)

C#算术表达式求值

算术表达式求值是一个经典的问题,很多学习编程的人都对此不陌生.本来我并不想写一个算术表达式求值的算法.在网上我看到了一篇文章,名叫<快速精确的对数学表达式求值>( http://www-128.ibm.com/developerworks/cn/java/j-w3eva/ ).才有兴趣着一个玩玩.写来写去,觉得真得很经典.所以把我写的代码拿出来让大家看看吧.因为时间较紧.所以变量名没有做得很规范. w3eavl是用JAVA写得,我用C#把它重写了一下.基本上能用,只是三角函数/反三角函数/双曲