您的位置:首页 > 理论基础 > 数据结构算法

面试算法:利用堆栈计算逆向波兰表达式

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就是表达式的结果。我们再看看对应的代码实现:

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,也就是说,我们代码对算法的实现应该是正确的。

很多其它技术信息,包括操作系统。编译器,面试算法。机器学习,人工智能,请关照我的公众号:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: