题目
栈
思路
栈基本问题:表达式求值
设置一个栈,当读入的 t o k e n token token 是操作数时,就将其转化为数字并入栈,如果是运算符,则将栈顶的两个操作数出栈后进行运算再入栈(如果是合法的表达式的话在调用运算符的时候栈中一定有大于等于两个的操作数存在),最后,栈中只会存在一个数字,这个数字就是表达式的计算结果。
代码
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 给定一个后缀表达式,返回它的结果
* @param str string字符串
* @return long长整型
*/
long long legalExp(string str) {
// write code here
stack<long long> stk;
string token;
int n = str.size(), i = 0, j = 0;
long long a = 0, b = 0;
while (i < n) {
if (isdigit(str[i])) {
// 如果当前字符是数字,那么就读取整个操作数
token.clear();
while (i < n && isdigit(str[i])) {
token.push_back(str[i]);
i++;
}
// 操作数入栈
stk.emplace(stoll(token));
continue;
} else if (str[i] == '#') {
// 如果当前字符是操作数结束符,则不管
i++;
continue;
}
// 如果是运算符
// 那么先得到操作数
a = stk.top();
stk.pop();
b = stk.top();
stk.pop();
// 再进行运算
if (str[i] == '+') {
// 加法运算
stk.emplace(a + b);
} else if (str[i] == '-') {
// 减法运算
stk.emplace(b - a);
} else if (str[i] == '*') {
// 乘法运算
stk.emplace(a * b);
}
i++;
}
// 如果是合法的后缀表达式,那么运算完毕之后
// 栈中只有一个数,即为表达式结果
return stk.top();
}
};