leecode: 150. 逆波兰表达式求值
根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
注意 两个整数之间的除法只保留整数部分。
可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
注意:
逆波兰表达式:也是后缀表达式
思路:
这里可以这么考虑:字符串数组中可以分为两类:数字字符串和运算符字符串。用栈来解决(因为栈的特性后进先出,比如:遇到运算符直接弹出紧挨着两个数字),遇数字入栈,遇运算符弹出2个数字来进行运算
class Solution {
public int evalRPN(String[] tokens) {
//定义栈
Stack<Integer> stack = new Stack<>();
//遍历字符串数组
for(int i=0; i<tokens.length; i++){
String s = tokens[i];
//此时s可以是数字也可以是+、-、*、/运算符,而且处理方式不同,可以用iflese,但感觉用switch会更好
int o1;
int o2;
Integer o;
switch(s){
case "+":
//弹出2个操作数
o1 = stack.pop();
o2 = stack.pop();
o = o2 + o1; // 先进后出,所以o2是在前面
stack.push(o); // 将结果入栈
break;
case "-":
//弹出2个操作数
o1 = stack.pop();
o2 = stack.pop();
o = o2 - o1; // 先进后出,所以o2是在前面
stack.push(o); // 将结果入栈
break;
case "*":
//弹出2个操作数
o1 = stack.pop();
o2 = stack.pop();
o = o2 * o1; // 先进后出,所以o2是在前面
stack.push(o); // 将结果入栈
break;
case "/":
//弹出2个操作数
o1 = stack.pop();
o2 = stack.pop();
o = o2 / o1; // 先进后出,所以o2是在前面
stack.push(o); // 将结果入栈
break;
default:
//说明此时s为数字字符串
stack.push(Integer.valueOf(s));
}
}
return stack.pop();
}
}
总结:
1、我第一次用的是ifelse来写的,但是时间复杂度更高,且更消耗内存,所以,后面还是用switch语句
2、我在用switch时,定义的3个变量写在了switch里面,发现报错:在switch里不能重复定义一个变量,表明整个switch内是一个代码块,而非每个case都是一个代码块。
继续加油