目录
问题描述:
实现代码和解析:
原理思路:
问题描述:
给你一个字符串数组 tokens
,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
示例 1:
输入:tokens = ["2","1","+","3","*"] 输出:9 解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
示例 2:
输入:tokens = ["4","13","5","/","+"] 输出:6 解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
示例 3:
输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"] 输出:22 解释:该算式转化为常见的中缀算术表达式为: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5 = ((10 * (6 / (12 * -11))) + 17) + 5 = ((10 * (6 / -132)) + 17) + 5 = ((10 * 0) + 17) + 5 = (0 + 17) + 5 = 17 + 5 = 22
实现代码和解析:
class Solution {
public:
int evalRPN(vector<string>& tokens)
{
stack<long int> st;
for(int i=0;i<tokens.size();i++)
{
//当遇到运算符时
if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/")
{
long int nums2=st.top();
st.pop();
long int nums1=st.top();
st.pop();
if(tokens[i]=="+") st.push(nums1+nums2);
else if(tokens[i]=="-") st.push(nums1-nums2);
else if(tokens[i]=="*") st.push(nums1*nums2);
else if(tokens[i]=="/") st.push(nums1/nums2);
}
//遇到数字时
else
{
st.push(stol(tokens[i]));
}
}
return st.top();
}
};
原理思路:
逆波兰表达式其实就是数据结构中的后缀表达式,是用栈是实现的经典例子,循环遍历字符串,当遇到数字就入栈,遇到运算符的时候就出栈两个元素进行运算后将结果再次入栈,画个图给大家演示一下过程。
有些地方应该是没有引号的,我为了统一就没去掉,不过不影响理解。还有一些题外话,就是这里的转换函数,这里没有用int因为这道题测试数据超出了范围,所以我们这里用long int。
stol()此函数将在函数调用中作为参数提供的字符串转换为long int。它解析str并将其内容解释为指定基数的整数,并将其作为long int类型的值返回。
stoll()此函数将在函数调用中作为参数提供的字符串转换为long long int。它解析str并将其内容解释为指定基数的整数,并将其作为long long int类型的值返回。