java控制台应用小程序_Java 实现四则运算小程序-基于控制台

9ec63c47f29bbf9f84a67bdbc3de555f.png

查重思路的实现:

1、制定优化二叉树的策略,以达到将表达式规范化的目的,当表达式规范后,重复的表达式将以“同一面目”出现,我们之后就可以直接根据字符串的比较判断两个表达式是否相同。

优化策略如下:

(1)如果右子树的值大于左子树,则左右左子树互换,这样可以保证运算中不会出现负数。

(2)不管左右子树的运算符优先级如何,凡左右子树的根节点为运算符的,在生成表达式时统一在两边加上括号。

a002593bd78500e1d176ddc2a69aa3b2.png

如图所示的二叉树,将生成:(1+3)-(1*2)

如:1+2+3,3+(1+2)的两个表达式,规范化后都会变为(1+2)+3,此时我们只需进行字符串比较即可判断题目是否重复

代码说明:

1、

/*

* 按规则优化二叉树,使其计算过程中不出现负数,并且中序遍历,生成查重使用的表达式,进行查重处理

* 按照二叉树求值

*

*/

public BinaryTree adjustmentTree(BinaryTree t) {

if(t!=null) {

String left_value =getTree_value(t.getLeft_tree());

String right_value = getTree_value(t.getRight_tree());

//若右子树的值大于左子树,则交换子树

if(right_value.equals("")||left_value.equals("")) {

return t;

}

else if(dataOper.operData(right_value, left_value,"?").equals("1")) {

t=swapChildTree(t);

}

t.setLeft_tree(adjustmentTree(t.getLeft_tree()));

t.setRight_tree(adjustmentTree(t.getRight_tree()));

}

return t;

}

//中序遍历二叉树,转化为符合预定运算顺序的带括号的表达式

public String treeToExpression(BinaryTree t) {

String left_s="";

String right_s="";

String expression="";

if(t!=null) {

if(t.getLeft_tree()!=null&&t.getRight_tree()!=null) {

String left_root=t.getLeft_tree().getRoot_data();

String right_root=t.getRight_tree().getRoot_data();

if(left_root.equals("+")||left_root.equals("-")||left_root.equals("*")||left_root.equals("÷")) {

left_s="("+treeToExpression(t.getLeft_tree())+")";

}

else {

left_s=treeToExpression(t.getLeft_tree());

}

if(right_root.equals("+")||right_root.equals("-")||right_root.equals("*")||right_root.equals("÷")) {

right_s="("+treeToExpression(t.getRight_tree())+")";

}

else {

right_s=treeToExpression(t.getRight_tree());

}

}

expression=left_s + t.getRoot_data() + right_s;

}

return expression;

}

2、

//由随机生成的基本表达式的后缀表达式按要求构建二叉树

public BinaryTree OptiExpression(String expression) {

Stack stack = new Stack();

Stack tstack = new Stack();

BinaryTree bt = new BinaryTree();

char []express = expression.toCharArray();

String s = "";//暂存入栈信息

for(int i=0;i

if(express[i]!='+'&&express[i]!='-'&&express[i]!='*'&&express[i]!='÷'&&express[i]!='#') {

s+=express[i];

}

else if(express[i]=='#'){

if(!s.equals("")) {

BinaryTree t = new BinaryTree();

t.setRoot_data(s);

t.setLeft_tree(null);

t.setRight_tree(null);

tstack.push(t);

bt=t;

}

s="";

}

else if(express[i]=='+'||express[i]=='-'||express[i]=='*'||express[i]=='÷') {

if(!s.equals("")) {

BinaryTree t = new BinaryTree();

t.setRoot_data(s);

t.setLeft_tree(null);

t.setRight_tree(null);

tstack.push(t);

bt=t;

}

s=""+express[i];

//System.out.println("zan"+tstack.size());

BinaryTree t1 = new BinaryTree();

t1.setRoot_data(s);

t1.setRight_tree(tstack.pop());

t1.setLeft_tree(tstack.pop());

tstack.push(t1);

s="";

bt=t1;

}

}

return bt;

}

五、测试运行

049f1ff104f0b326be96c77a4f8e6067.png

a0c0c57c4757fb2de9c37049efb1bc5d.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值