chartemp;//获取该中缀表达式中的每一个字符并进行相对应的判断
char ch =infixExpression.charAt(i);switch(ch) {//忽略空格
case ' ':break;//如果是左括号直接压入栈中
case '(':
characterStack.push(ch);break;//碰到'+' '-',将栈中的所有运算符全部弹出去,直至碰到左括号为止,输出到队列中去
case '+':case '-':while (characterStack.size() != 0) {
temp=characterStack.pop();if (temp == '(') {//如果推出来的那个字符刚好是左括号,那么就重新将左括号放回栈中,并终止循环
characterStack.push('(');break;
}
suffix+=temp;
}//没有进入循环说明当前为第一次进入或者前面运算都有括号等情况所导致//将当前符号压入栈中
characterStack.push(ch);
suffix+= "#";break;//如果是乘号或者除号,则弹出栈中所有运算符,直到碰到加号、减号、左括号为止,最后将该运算符压入栈中
case '*':case '÷':while (characterStack.size() != 0) {
temp=characterStack.pop();//只有比当前优先级高的或者相等的才会弹出到输出队列,遇到加减左括号,直接停止当前循环
if (temp == '+' || temp == '-' || temp == '(') {
characterStack.push(temp);break;
}else{
suffix+=temp;
}
}//没有进入循环说明当前为第一次进入或者前面运算都有括号等情况所导致//将当前符号压入栈中
characterStack.push(ch);
suffix+= "#";break;//如果碰到的是右括号,则距离栈顶的第一个左括号上面的所有运算符将被弹出栈并抛弃左括号(既不需要将左括号输出到队列中也不需要将右括号压入栈中)
case ')':while (!characterStack.isEmpty()) {
temp=characterStack.pop();if (temp == '(') {break;
}else{
suffix+=temp;
}
}break;//默认情况,如果读取到的是操作数,则直接送至输出队列
default:
suffix+=ch;break;
}
}//最后如果栈中依然还有运算符的话,则把剩余运算符一次弹出,送至输出序列
while (characterStack.size() != 0) {
suffix+=characterStack.pop();
}returnsuffix;
}
第三部分:将后缀表达式转化成二叉树,利用二叉树的优先级,将同等级的运算数进行排序,从而把中缀表达式不相同的的式子,转化成为后缀表达式一样的式子,便可找出重复的式子,并剔除掉。
/*** function:优化策略一(按规则优化二叉树,使其计算过程中不会出现负数)
*
*@paramtree
*@return
*/
publicBinaryTree adjustmentTree(BinaryTree tree) {if (tree != null) {
String leftValue=getTreeValue(tree.getLeftTree());
String rightValue=getTreeValue(tree.getRightTree());//若右子树的值大于左子树,则交换子树
if (rightValue.equals("") || leftValue.equals("")) {//表示此时已经递归到叶子了,直接返回即可
returntree;
}else if (dataOperation.calculateData(rightValue, leftValue, "?").equals("1")) {
tree=swapChildTree(tree);
}
tree.setLeftTree(adjustmentTree(tree.getLeftTree()));
tree.setRightTree(adjustmentTree(tree.getRightTree()));
}returntree;
}/*** function:优化策略二(中序遍历二叉树,转化为符合预定运算顺序的带括号的表达式)
*
*@paramtree
*@return
*/
publicString treeToExpression(BinaryTree tree) {
String left= "";
String right= "";
String expression= "";if (tree != null) {if (tree.getLeftTree() != null && tree.getRightTree() != null) {
String leftRoot=tree.getLeftTree().getRootData();
String rightRoot=tree.getRightTree().getRootData();if (leftRoot.equals("+") || leftRoot.equals("-") || leftRoot.equals("*") || leftRoot.equals("÷")) {
left= "(" + treeToExpression(tree.getLeftTree()) + ")";
}else{
left=treeToExpression(tree.getLeftTree());
}if (rightRoot.equals("+") || rightRoot.equals("-") || rightRoot.equals("*") || rightRoot.equals("÷")) {
right= "(" + treeToExpression(tree.getRightTree()) + ")";
}else{
right=treeToExpression(tree.getRightTree());
}
}
expression= left + tree.getRootData() +right;
}returnexpression;
}
5、测试运行
这是题目生成个数100个,数值范围是10的情况
这是生成题目10000条的情况,经过大量的测试,发现。。。。。