逆波兰表达式求值
这是LeetCode的150题,这里是接上篇文章写的http://lovedm.club/?id=129
逆波兰表达式:
逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。
平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
逆波兰表达式主要有以下两个优点:
去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
实现较简单:
用栈实现。逆波兰式从头开始扫描,遇到数字就入栈,遇到运算符就将栈顶两个元素出栈运算后结果再入栈,扫描结束后,最后在栈里的元素就是表达式的值
这里直接使用LeetCode中提交的代码:
public int EvalRPN(string[] tokens) { //用栈实现。逆波兰式从头开始扫描,遇到数字就入栈,遇到运算符就将栈顶两个元素出栈运算后结果再入栈, //扫描结束后,最后在栈里的元素就是表达式的值 Stack<int> stack = new Stack<int>(); for (int i = 0; i < tokens.Length; i++) { int num; if (int.TryParse(tokens[i], out num)) { stack.Push(num); } else if (tokens[i] == "+") { stack.Push(stack.Pop() + stack.Pop()); } else if (tokens[i] == "-") { int a = stack.Pop(); int b = stack.Pop(); stack.Push(b - a); } else if (tokens[i] == "*") { int a = stack.Pop(); int b = stack.Pop(); stack.Push(b * a); } else if (tokens[i] == "/") { int a = stack.Pop(); int b = stack.Pop(); stack.Push(b / a); } } return stack.Pop(); }