这道题是逆波兰式的求解,不了解逆波兰式的朋友可以参考一下逆波兰表示法 - wiki。逆波兰式有个优点就是他不需要括号来表示优先级,直接根据式子本身就可以求解。思路是维护一个运算数栈,读到运算数的时候直接进栈,而每得到一个运算符,就从栈顶取出两个运算数,运算之后将结果做为一个运算数放回栈中,直到式子结束,此时栈中唯一一个元素便是结果。代码如下:
public int evalRPN(String[] tokens) { if(tokens==null || tokens.length==0) return 0; LinkedList<Integer> stack = new LinkedList<Integer>(); for(int i=0;i<tokens.length;i++) { if(tokens[i].equals("+")) { stack.push(stack.pop()+stack.pop()); } else if(tokens[i].equals("-")) { stack.push(-stack.pop()+stack.pop()); } else if(tokens[i].equals("*")) { stack.push(stack.pop()*stack.pop()); } else if(tokens[i].equals("/")) { int num1 = stack.pop(); int num2 = stack.pop(); stack.push(num2/num1); } else { stack.push(Integer.parseInt(tokens[i])); } } return stack.pop(); }以上代码中有一个没有周全的地方是没有对逆波兰式错误的情况进行出错处理,其实也不难,就是每次pop操作检查栈空情况,如果栈空,则说明出错。还有就是最后检查一下栈的size,如果不是1也说明运算数多了,返回错误。有兴趣的朋友可以自己补充一下哈。
和这道题类似的,有波兰式求解,中缀表达式求解,这几个其实是表达式的不同表达方式。既然这里出现了逆波兰式,大家还是看看其他两种的求解方法,原理其实近似,都是通过维护栈来实现,网上也有不少材料,这里就不细说了。
没有评论:
发表评论