字符串计算器
坐标2020-4-24
经过-华为二面
面试官给了一张动态图,问我:二十分钟能写出一个简单的字符串计算器吗?
略微思考:应该可以吧
接着在混乱的思路中,想用递归,又想用栈,最后写出一个无数空指针异常的计算器,结束后,痛定思痛,今天就教大家写一个字符串计算器。
首先,我们一定需要一个函数来判断字符是否是数字,
public static boolean isNum(char x){
return x>=48 && x<=57;
}//利用ascall码判断是否为数字
有了它,我们进行第二步,设计算法思路。
字符串计算器的解题思路呢,我在网上只看见一种,就是用中缀波兰表达式转化为后缀,然后逐个计算。而在我面试的过程中,我的第一反应是使用递归,将所有括号缩减,然后按先乘除,后加减的顺序计算,今天我们将两个思路都进行完善。
思路1:波兰表达式
首先我们看如下表达式 2+3*(6-2) 这个式子,也就是我们输入的式子,就是中缀波兰表达式,我们将它转化为后缀表达式,得到的应该是 2 3 6 2 - * +
大家发现什么规律了呢? 也就是将运算符按运算顺序放到数字的后面,我们计算的时候只需要用一个栈来辅助,就可以按顺序计算出来结果了。
有的小伙伴说,思路我懂,怎么写呢?且听我慢慢道来。
第一步,我们需要一些辅助工具,
1.字符串
StringBuilder stringBuilder = new StringBuilder();
使用StringBuilder来存储转化完成的后缀表达式。
2.栈
Stack<Character> stack = new Stack<>();
我们用栈来辅助存储。
3.原表达式的字符形式
char x[] = str.toCharArray();
我们把传入函数的字符串转化为字符型数组,这样方便使用isNum函数判断
那么现在函数就是这个样子
public static String inorder (String str){
Stack<Character> stack = new Stack<>();
char x[] = str.toCharArray();
StringBuilder stringBuilder = new StringBuilder();
retrun null;
}
下一步,我们遍历整个字符型数组
public static String inorder (String str){
Stack<Character> stack = new Stack<>();
char x[] = str.toCharArray();
StringBuilder stringBuilder = new StringBuilder();
for(int i=0;i<x.length;i++){
}
retrun null;
}
现在想想,我们遍历数组的过程中应该完成什么操作呢?
有以下几种情况
1.当前字符为数字
2.当前字符为运算符
3.当前字符为括号
在情况1中,我们只需要将其加入结果,因为我们最后的后缀表达式中,数字是按照原有顺序排列的。
public static String inorder (String str){
Stack<Character> stack = new Stack<>();
char x[] = str.toCharArray();
StringBuilder stringBuilder = new StringBuilder();
for(int i=0