1.牛牛与后缀表达式(非单调栈)
给定牛牛一个后缀表达式s,计算它的结果,例如,1+1对应的后缀表达式为1#1#+,‘#’作为操作数的结束符号。
其中,表达式中只含有‘+’、’-‘、’*‘三种运算,不包含除法。
本题保证表达式一定合法,且计算过程和计算结果的绝对值一定不会超过101810^{18}1018
自己写的代码:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 给定一个后缀表达式,返回它的结果
* @param str string字符串
* @return long长整型
*/
long long legalExp(string str) {
// write code here
stack<long long>s;
int n=0;
for(int i=0;i<str.size();i++)
{
if(isdigit(str[i]))
{
n=n*10+str[i]-'0';
}
else if(str[i]=='#')
{
s.push(n);
n=0;
}
else
{
long long x,y;
x=s.top();
s.pop();
y=s.top();
s.pop();
if(str[i]=='+')
s.push(x+y);
else if(str[i]=='-')
s.push(y-x);
else if(str[i]=='*')
s.push(x*y);
}
}
return s.top();
}
};
总结:解题思路:
1.题目中给定的输出是一段字符串,题目说明了计算量最大为10的18次方,没有超过long long,所以要用string单个输出并转成longlong型。
2.该题只需要一次循环,将字符串完全遍历即可,故可以灵活使用栈,出现运算符即算出结果,再移回栈中,这样就实现了“括号”。