首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

用java兑现了一个小的计算器

2012-10-10 
用java实现了一个小的计算器突然之间心血来潮,就是想试一试数据结构怎么用.到现在才感觉的,数据结构是一种

用java实现了一个小的计算器

突然之间心血来潮,就是想试一试数据结构怎么用.到现在才感觉的,数据结构是一种思想,一种思维方式,用怎样的方式去解决怎样的问题,这些是数据结构和算法给我们的.

言归正传吧,说说这个小计算器(其实还有太多需要扩展和改进的地方).暂时只局限在加减乘除,因为定义的是int类型的,所以也限制在整数运算吧.

主要思路是这样的:计算器最主要的部分是获取用户输入,然后根据算法将获取到的输入存储成为二叉树.当然,肯定要用栈存储的.

先看一下简单的分析:

1+2-3:? 存储成二叉树应该是这样的:节点上的值为运算符,左右孩子为数值:

???? +

??? /?? \

? +??? 3

/??? \

1??? 2??

也就是说,存好后用后序方法来进行读取,然后计算.

如果有*和/,则如下:

1+2*3-6/2:

?????????????????? -

?????????????? /??? ?\

?????????????+?? ??? /

????????????/??\??? / \

???????????1?? *? 6? 2

??????????????? /?\

???????????????2? 3???

其实,从这些分析上,可以得出一个结论,暂且是对于这个计算器范围内的结论(没有括号之类的...)

(1)两个栈,一个CTack,用来存放暂时的操作符,一个TTack,用来存放二叉树.两个栈结构,一个栈存放的是String类型,另一个存放二叉树Node类型.

(2)一次对用户输入的字符进行遍历,通过下面的原则判断是否压栈还是出栈组成二叉树.

?? 方式:首先,在输入字符是数字时,先创建一个TTack,左右孩子赋值为null,data值赋值为数字.

????????? 输入遍历到操作符时:a: CTack为空;b:CTack当前操作符优先级<读入的操作符 ; 压栈CTack

????????????????????????????????????? aa:CTack当前操作符优先级>=读入操作符优先级,新建Node,出栈TTack中的两个Node分别

??????????????????????????????????????????? 作为新Node的左右孩子,操作符作为节点值,之后再次压栈TTack.

(3)读完后,如果CTack还不是null,则以此取出TTack中的两个Node作为新Node的左右孩子,CTack出栈的操作符作为节点值.之后压栈.

?

思路大体就是这样,这个过程中其实有很多问题,其中比较难的是:如果操作符和已经有的是相等的关系,那么就是循环进行新建节点,压栈这些操作.

?

核心程序:

package com.pipi.structure;/** *  * @author pipi * 定义二叉树 */public class Node {String data = new String(); //数据Node lchild = null; //左孩子,如果没有,设置为nullNode rchild = null; //右孩子,如果没有,设置为nullpublic String getData() {return data;}public void setData(String data) {this.data = data;}public Node getLchild() {return lchild;}public void setLchild(Node lchild) {this.lchild = lchild;}public Node getRchild() {return rchild;}public void setRchild(Node rchild) {this.rchild = rchild;}}

?

总结:

其实,这个程序只是实现了一个思想,还有很多没有考虑到的地方,还有很多代码需要重构.总的来说,学会了这种思想也是一个小小的进步,接下来会好好完善一下代码.

GOGO~

?

热点排行