面试算法:利用堆栈计算逆向波兰表达式
2017-08-16 11:29
330 查看
更具体的解说和代码调试演示过程,请參看视频
怎样进入google,算法面试技能全面提升指南
给定一个四则运算表达式的字符串。假设该表达式满足逆向波兰表达式,那么该字符串要满足下面条件:
1: 该表达式含有一个数字字符或一串数字字符。
2:它拥有给定格式,如”A, B, 。“。当中A,B是逆向波兰表达式。句号。
表示的是四种运算符”+,-,*,/”当中之中的一个。
比如字符串“3,4,*,1。2,+,+”就满足逆向波兰表达式,该表达式的值为:3 * 4 + (1+2) = 15.
给定一个逆向波兰表达式。要求计算该表达式的值。
处理算法题时,选择合适的数据结构。相当于把问题解决掉了一大半。处理逆向波兰表达式最好的数据结构是堆栈,算法例如以下:
1, 假设当前字符是数字,那么把数字压入堆栈。
2, 假设当前字符是运算符,那么从堆栈中弹出两个元素,做对应计算,然后把结果压入堆栈
3, 当全部字符处理完成后。堆栈上包括的数值就是表达式的值。
我们依据给定样例,把上面的算法走一遍。
第一个字符是数字字符3。所以压入堆栈:
char: 3
stack: 3
第二个字符是数字4,所以压入堆栈
char: 3, 4
stack: 3, 4
第三个字符是运算符,因此把堆栈上头的两个元素弹出,做对应计算,然后把结果压入堆栈:
char: 3, 4, *
stack:12
第四个字符是数字,因此压入堆栈:
char: 3, 4, *, 1
stack: 12, 1
第五个字符是数字2,因此压入堆栈:
char: 3, 4, * , 1, 2
stack: 12, 1, 2
第六个字符是运算符,因此弹出堆栈顶部的两个元素做对应计算
char: 3, 4, *, 1, 2, +
stack: 12, 3
第七个字符是运算符,因此弹出堆栈顶部两个元素做计算:
char: 3, 4, *, 1, 2, +, +
stack: 15
到此字符处理完成。堆栈上的数值15就是表达式的结果。我们再看看对应的代码实现:
上面代码实现的正是前头说明的算法步骤,我们先把含有逗号分隔的字符串分成对应部分。在for循环中推断,假设遇到的是数字,那么把它压入堆栈,假设遇到的是运算符。那么把数字从堆栈上弹出,做对应计算。把计算结果再压入堆栈。
最后我们再看看主入口函数:
执行上面代码后得到的输出结果是:
The result of reverse polish express is 15
也就是说,给定的逆向波兰表达式的结果确实是15,也就是说,我们代码对算法的实现应该是正确的。
很多其它技术信息,包括操作系统。编译器,面试算法。机器学习,人工智能,请关照我的公众号:
怎样进入google,算法面试技能全面提升指南
给定一个四则运算表达式的字符串。假设该表达式满足逆向波兰表达式,那么该字符串要满足下面条件:
1: 该表达式含有一个数字字符或一串数字字符。
2:它拥有给定格式,如”A, B, 。“。当中A,B是逆向波兰表达式。句号。
表示的是四种运算符”+,-,*,/”当中之中的一个。
比如字符串“3,4,*,1。2,+,+”就满足逆向波兰表达式,该表达式的值为:3 * 4 + (1+2) = 15.
给定一个逆向波兰表达式。要求计算该表达式的值。
处理算法题时,选择合适的数据结构。相当于把问题解决掉了一大半。处理逆向波兰表达式最好的数据结构是堆栈,算法例如以下:
1, 假设当前字符是数字,那么把数字压入堆栈。
2, 假设当前字符是运算符,那么从堆栈中弹出两个元素,做对应计算,然后把结果压入堆栈
3, 当全部字符处理完成后。堆栈上包括的数值就是表达式的值。
我们依据给定样例,把上面的算法走一遍。
第一个字符是数字字符3。所以压入堆栈:
char: 3
stack: 3
第二个字符是数字4,所以压入堆栈
char: 3, 4
stack: 3, 4
第三个字符是运算符,因此把堆栈上头的两个元素弹出,做对应计算,然后把结果压入堆栈:
char: 3, 4, *
stack:12
第四个字符是数字,因此压入堆栈:
char: 3, 4, *, 1
stack: 12, 1
第五个字符是数字2,因此压入堆栈:
char: 3, 4, * , 1, 2
stack: 12, 1, 2
第六个字符是运算符,因此弹出堆栈顶部的两个元素做对应计算
char: 3, 4, *, 1, 2, +
stack: 12, 3
第七个字符是运算符,因此弹出堆栈顶部两个元素做计算:
char: 3, 4, *, 1, 2, +, +
stack: 15
到此字符处理完成。堆栈上的数值15就是表达式的结果。我们再看看对应的代码实现:
import java.util.Stack; public class ReversePolishExpr { private String expression; Stack<Integer> stack = new Stack<Integer>(); public ReversePolishExpr(String expr) { this.expression = expr; } public int calculation() throws Exception { String[] exprs = expression.split(","); for (int i = 0; i < exprs.length; i++) { if (isOperator(exprs[i]) && stack.size() < 2) { throw new Exception("Expression error"); } if (isOperator(exprs[i])) { doCalculation(exprs[i]); } else { stack.push(Integer.valueOf(exprs[i])); } } return stack.pop(); } private boolean isOperator(String c) { if (c.equals("+") == true || c.equals("-") == true || c.equals("*") == true || c.equals("/") == true) { return true; } return false; } private void doCalculation(String c) { int op1 = stack.pop(); int op2 = stack.pop(); switch (c) { case "+": stack.push(op1 + op2); break; case "-": stack.push(op1 - op2); break; case "*": stack.push(op1*op2); break; case "/": stack.push(op1/op2); break; } } }
上面代码实现的正是前头说明的算法步骤,我们先把含有逗号分隔的字符串分成对应部分。在for循环中推断,假设遇到的是数字,那么把它压入堆栈,假设遇到的是运算符。那么把数字从堆栈上弹出,做对应计算。把计算结果再压入堆栈。
最后我们再看看主入口函数:
public class StackAndQuque { public static void main(String[] args) { ReversePolishExpr rp = new ReversePolishExpr("3,4,*,1,2,+,+"); try { System.out.println("The result of reverse polish express is " + rp.calculation()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
执行上面代码后得到的输出结果是:
The result of reverse polish express is 15
也就是说,给定的逆向波兰表达式的结果确实是15,也就是说,我们代码对算法的实现应该是正确的。
很多其它技术信息,包括操作系统。编译器,面试算法。机器学习,人工智能,请关照我的公众号:
相关文章推荐
- 面试算法:利用堆栈计算逆向波兰表达式
- PHP逆波兰表达式的算法-工资计算专用
- 我就给一个PHP逆波兰表达式的算法吧---工资计算专用
- 如何利用堆栈及逆波兰表达式进行数学四则运算(C语言版)
- 我就给一个PHP逆波兰表达式的算法吧---工资计算专用
- 我就给一个PHP逆波兰表达式的算法吧---工资计算专用
- VB利用堆栈实现表达式计算
- 面试算法:计算堆栈当前元素的最大值
- 我就给一个PHP逆波兰表达式的算法吧---工资计算专用
- 我就给一个PHP逆波兰表达式的算法吧---工资计算专用
- 我就给一个PHP逆波兰表达式的算法吧---工资计算专用
- 我就给一个PHP逆波兰表达式的算法吧---工资计算专用
- 从键盘上输入一个后缀表达式,试编写算法计算表达式的值。规定:逆波兰表达式的长度不超过一行,以$符作为输入结束,操作数之间用空格分隔,操作符只可能有+、-、*、/四种运算。例如:234 34+2*$。
- 利用堆栈计算算数表达式
- 我就给一个PHP逆波兰表达式的算法吧---工资计算专用
- 算法基础系列之四:表达式计算及逆波兰栈
- 我就给一个PHP逆波兰表达式的算法吧---工资计算专用
- 【LeetCode-面试算法经典-Java实现】【150-Evaluate Reverse Polish Notation(计算逆波兰式)】
- 利用栈结构计算表达式串算法
- 我就给一个PHP逆波兰表达式的算法吧---工资计算专用