描述:
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
有效的算符为 '+'、'-'、'*' 和 '/' 。
每个操作数(运算对象)都可以是一个整数或者另一个表达式。
两个整数之间的除法总是 向零截断 。
表达式中不含除零运算。
输入是一个根据逆波兰表示法表示的算术表达式。
答案及所有中间计算结果可以用 32 位 整数表示。
示例 :
输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
图片分析:
![](https://img-blog.csdnimg.cn/img_convert/ee25da5edbd0bcf0d6e0f9cf10f7ec4e.png)
代码分析:(Java为例)
class Solution {
public int evalRPN(String[] tokens) {
//实例化一个栈
Stack<Integer> st = new Stack<Integer>();
//遍历所给字符串
for(String str:tokens)
{
//判断字符串是否是符号
if( "+".equals(str) || "-".equals(str) || "*".equals(str) || "/".equals(str))
{
//栈顶元素作为符号右边
int right = st.peek();
st.pop();//注意一定要出栈
//栈顶元素的下一个作为符号的左边
int left = st.peek();
st.pop();
//判断是哪一个符号,然后进行相应的操作
switch(str)
{
case "+":
st.push(left+right);//结果再次入栈
break;
case "-":
st.push(left-right);
break;
case "*":
st.push(left*right);
break;
case "/":
st.push(left/right);
break;
}
}
else
{
//不是符号直接入栈,从左向右扫描入栈
st.push(Integer.parseInt(str));
}
}
//返回栈顶元素,就是所得的值
return st.peek();
}
}