使用java计算xml字符串中给定的数学表达式



假设

  • 当我们看到起始元素时,如果数字在数字堆栈中推送它
  • 如果我们看到函数/加法/乘法的起始元素,则将其推送到运算符堆栈中
  • 当我们看到函数/加法/乘法的结束元素时,我们从数字堆栈中弹出一个运算符和所需值
  • 我们做数学运算,把结果推回到数字堆栈

这个问题不能想到用三乘相加

XML字符串:

<function value="largest">
<multiply>
<numbr value="2" />
<numbr value="3" />
</multiply>
<add>
<multiply>
<numbr value="5" />
<numbr value="6" />
</multiply>
<multiply>
<numbr value="7" />
<numbr value="8" />
</multiply>
<multiply>
<numbr value="7" />
<numbr value="7" />
<numbr value="7" />
</multiply>
</add>
</function>

一些粗略的Java代码:

Stack<Value> value = new Stack<>();
Stack<Operator> operator = new Stack<>();
XMLInputFactory factory = XMLInputFactory.newInstance();
InputStream stream = new ByteArrayInputStream(xml.getBytes());
XMLStreamReader reader = factory.createXMLStreamReader(stream);
while (reader.hasNext()) {
int event = reader.next();
switch (event) {
case XMLStreamConstants.START_ELEMENT:
String attributeValue = reader.getAttributeValue(null, "value");
break;
case XMLStreamConstants.END_ELEMENT:
String localName = reader.getLocalName();
break;
}

参考链路

在花时间研究这个问题后,我发现它有一个递归的解决方案,因为给定的XML必须以n-ary tree的形式排列数据。以下是伪代码的样子:

public class RecursiveProgram{
/*the recfn is the recursive function to make new call on every new operator tag Example : "add", "multiply"*/
public static int recfn(String currentOperator){
int total;
/*We will use list to store multiple values on which only one operator will perform operations.*/
ArrayList<Integer> numberlist= new ArrayList<>(); 
/* now we will continue traversing elements. Assume currentOperator as current xml tag*/
while(nexttag() != currentOperator.end){ 
String tag= nexttag();
if(tag != value){
/*if tag is operator then make a new call and store its result in numberlist of current operator */
numberlist.add(recfn(tag)); 
}else{
numberlist.add(tag.value);
}
}
/*Once we found the end of the current operator then perform operation on all elements of numberlist.*/ 
if(currentOperator == "add"){
total=0;
for(Integer i : numberlist){
total+=i;
}
return total;
}else{
total=1;
for(Integer i : numberlist){
total*=i;
}
return total;
}
}
public static void main(String[] args){
int total;
String operator;
total=recfn(operator); //suould pass start operator
}
}

这个答案有很多相似之处指向阅读标签/值。所以它不会编译和运行。你必须消化算法的想法,并相应地自己实现它。此外,我建议使用上面的示例XML代码来验证算法。如果它满足,就给它一次机会。

最新更新