问题说明:
给定一个字符串,例如:
String gsstring = "3565767 + 276756 * 76764 - 76 / 2 + 1";
如何将其当作数字运算,即相当于:
int gsint = 3565767 + 276756 * 76764 - 76 / 2 + 1;
我们如何来解析这样一个简单的公式(当前没有括号参与操作
)。
第一步:将此字符串变换为字节数组,将问题转换为针对字节数组的处理。
byte[] b = gsstring.getBytes();
第二步:编写工具方法。
1、判定一个字节是否为数字。
final public static boolean isdig(byte ch) {
return ch >= '0' && ch <= '9';
}
2、将所有的数字字节整理为一个真实的数字。
final public static int dig(byte[] b) {
int record = 0;
for (int i = 0; i < b.length; i++) {
record = record * 10 + (b[i] - '0');
}
return record;
}
3、将字节表示的符号转换为真正的运算操作。
final public static int calc(int record1, int record2, byte oper) {
int record = 0;
switch (oper) {
case '+':
record = record1 + record2;
break;
case '-':
record = record1 - record2;
break;
case '*':
record = record1 * record2;
break;
case '/':
record = record1 / record2;
break;
default:
break;
}
return record;
}
第三步:解析字节数组,将其记录为一个数字的集合以及一个符号的集合。
final public static Vector parse(byte[] b) {
Vector v = new Vector();
Vector dig = new Vector();
Vector sgn = new Vector();
byte[] bb = null;
int size, j, k;
for (int i = 0; i < b.length; i++) {
size = 0;
if (isdig(b[i])) {
j = i;
do {
size++;
j++;
} while (j < b.length && isdig(b[j]));
bb = new byte[size];
j = i;
k = 0;
do {
bb[k] = b[j];
k++;
j++;
} while (j < b.length && isdig(b[j]));
i = i + size - 1;
dig.add(new Integer(dig(bb)));
} else {
sgn.add(Byte.valueOf(b[i]));
}
}
v.add(sgn);
v.add(dig);
return v;
}
第四步:操作得到的结果。
提供思路:这种公式的特点是数字集合总是比符号集合多1,并且都是按照顺序存储的(现在采取的方案是这样)。所以,根据先乘除后加减原则,检索符号集合中的乘除后再检索加减,数字集合位置索引与符号索引之间存在对应关系,不难发现的。
增加处理:
public static int test(String gs) {
byte[] b = dealByte(gs.getBytes());
Vector v = parse(b);
Vector sgn = (Vector) v.elementAt(0);
Vector dig = (Vector) v.elementAt(1);
while (sgn.size() != 0) {
for (int i = 0; i < sgn.size(); i++) {
if ('*' == ((Byte) sgn.elementAt(i)).byteValue()
|| '/' == ((Byte) sgn.elementAt(i)).byteValue()) {
operate(sgn, dig, i);i--;
}
}
for (int i = 0; i < sgn.size(); i++) {
if ('+' == ((Byte) sgn.elementAt(i)).byteValue()
|| '-' == ((Byte) sgn.elementAt(i)).byteValue()) {
operate(sgn, dig, i);i--;
}
}
}
return ((Integer) dig.elementAt(0)).intValue();
}
static private void operate(Vector sgn, Vector dig, int index) {
int value = calc(((Integer) dig.elementAt(index)).intValue(),
((Integer) dig.elementAt(index + 1)).intValue(), ((Byte) sgn
.elementAt(index)).byteValue());
sgn.remove(index);
dig.setElementAt(new Integer(value), index);
dig.remove(index + 1);
}
此方式完全应用了算式的特点,加入括号处理相对复杂。
如何扩展加入(){}[],变得更强大一点??思考
OK。
分享到:
相关推荐
适用于通达信的缠论分笔分段公式,,有笔开关,K线包含处理开关,均线力度开关,速度很快,完全免费的!文件包含一个dll和一个公式
python处理公式 Python是一种高级编程语言,它可以用于处理各种类型的数据,包括数学公式。在本文中,我们将探讨如何使用Python处理数学公式。 Python中有许多库可以用于处理数学公式,其中最常用的是NumPy和SymPy。...
现代信号处理公式概念的小结,pdf文件格式,包含随机信号,参数估计理论,功率谱估计,自适应信号处理,高阶统计特征等
C#字符串计算公式处理。例如工资计算公式:"{基本工资}+{奖金}-{保险}-{个税}"。
数学公式图像处理综述
LaTeX公式转化处理工具.,可以将LaTeX数学公式转成图片
AS3动画效果公式代码以及常用处理公式代码整理
在使用Qt开发时,遇到大量带变量的公式计算,此时写代码解析公式非常繁琐,...可以处理数据库中的大量公式计算。此资源中包含源代码项目文件和打包完成的文件夹,下载后直接点击打包文件夹中的exe文件执行可看到效果。
原创通达信版 缠论K线包含公式.doc
Excel2010高效办公公式、函数与数据处理(超值版_全彩印刷)
纯粹是为了期末考试而编写的公式表格,所以不是很全,只写了会考到的公式。黄色背景的是重要公式。 目录如下 第一章 离散时间信号 第二章 离散时间系统 第三章 信号的傅里叶变换 第六章 无限冲击响应数字滤波器设计 ...
设计实例多少发生地哈根达斯士大夫计划时代复苏和地域上的告诉是法师法师的
贝叶斯公式在处理垃圾邮件中的应用
在汽车标定测试开发过程中,对测量数据(dat、mdf等文件格式)分析时,有时需要进行数据分析,比如原始的测量数据中有发动机转速、扭矩参数,但是没有功率参数,但是功率可以根据转速和扭矩参数计算,计算公式power=...
水泵设计,性液体泵性能换算图的公式化处理
污水处理设备设计公式大全
【1】需要先通过mathtype的格式化选项卡-转换公式-mathtype/MathML2.0(namespaceattr)进行文档初步处理成公式乱码 【2】运行宏一键转换! 【3】详细操作请见本人博客:将word中的公式编辑器转换成word自带公式
垃圾转运处理计算公式.docx
垃圾转运处理计算公式.doc
不知道在哪里看到的,蛮有用的资源。EXCEL中图标趋势线提取公式系数,在一些特定场景下用得上。比如需要对公式作进一步处理的时候。但是提取精度与原公式略有出入,但不影响大局。