链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
给定牛牛一个后缀表达式s,计算它的结果,例如,1+1对应的后缀表达式为1#1#+,‘#’作为操作数的结束符号。
其中,表达式中只含有‘+’、’-‘、’*‘三种运算,不包含除法。
本题保证表达式一定合法,且计算过程和计算结果的绝对值一定不会超过101810^{18}1018
示例1
输入
复制"1#1#+"
"1#1#+"
返回值
复制2
2
说明
1#1#+这个后缀表达式表示的式子是1+1,结果为2
示例2
输入
复制"12#3#+15#*"
"12#3#+15#*"
返回值
复制225
225
说明
12#3#+15#*这个后缀表达式表示的式子是(12+3)*15,结果为225
备注:
1≤表达式中操作数≤1091\leq表达式中操作数\leq10^91≤表达式中操作数≤109
1≤表达式长度≤1061\leq表达式长度\leq10^61≤表达式长度≤106
思路
后缀表达式(逆波兰表达式)算法,在读取到操作符前将数字入栈,读取到操作符时,将栈中两数字出栈,先出栈的为右操作数,后出栈的为左操作数,两数字操作后的结果入栈,最后栈内剩下的值即为表达式的值
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 给定一个后缀表达式,返回它的结果
* @param str string字符串
* @return long长整型
*/
long long legalExp(string str) {
long long temp=0;
stack<long long>st;
long long a1,a2,len=str.size();
for(int i=0;i<len;i++)
{
if(str[i]=='"')continue;
if(!st.empty()&&(str[i]=='+'||str[i]=='-'||str[i]=='*'))
{
a2=st.top();
st.pop();
a1=st.top();
st.pop();
if(str[i]=='+')//相加
st.push(a1+a2);
else if(str[i]=='-')//相减
st.push(a1-a2);
else //相乘
st.push(a1*a2);
}
else{
if(str[i]!='#')
{
temp=temp*10+(str[i]-'0');
}
else{
st.push(temp);
temp=0;
}
}
}
return st.top();
}
};