题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
// 从s1中取两个值,从vv中取一个操作符 来运算
void fun(stack<int>& s1, vector<char>& vv, int& top)
{
int right = s1.top();
s1.pop();
int left = s1.top();
s1.pop();
if (vv[top] == '+')
s1.push(left + right);
else if (vv[top] == '-')
s1.push(left - right);
else
s1.push(left * right);
top--; // 删除使用了的操作符
}
int solve(string s) {
// write code here
int size = s.size();
stack<int> s1; // 数字的栈
vector<char> vv(size); // 操作符的栈
int top = -1;
for (int i = 0;i<size;i++) {
if (s[i] == '(') // 直接插入即可
vv[++top] =s[i] ;
else if (s[i] == '*') { // ‘(’之前的‘*’全部输出
while (top != -1) {
if (vv[top] == '*') {
fun(s1, vv, top);
}
else
break;
}
vv[++top] = s[i];
}
else if (s[i] == '+' || s[i] == '-') {
// 把‘(’之前的操作符全部输出
while (top != -1) {
if (vv[top]!='(') {
fun(s1, vv, top);
}
else
break;
}
vv[++top] = s[i];
}
else if (s[i] == ')')
{
// 把左括号之前的全部出栈
while (top != -1)
{
if (vv[top] != '(')
{
fun(s1, vv, top);
}
else
{
top--;
break;
}
}
}
else // 插入数字栈中
{
// 可能有多位数
int num = s[i]-'0';
while (i + 1 < size && s[i + 1] >= '0' && s[i + 1] <= '9')
{
num = num * 10 + s[i + 1] - '0';
i++;
}
s1.push(num);
}
}
fun(s1, vv, top);
return s1.top();
}
};
首先要了解中缀表达式的求解过程。
需要两个栈,一个存操作数,用stl中的stack来实现,一个存操作符,用vector<char>来实现,方便读取数据。
然后依次遍历,如果遇到操作数,则压入s1中,遇到操作符,则需要考虑。
如果此操作符为'*'号,则输出左括号之前的全部为'*'号的操作符,这里直接调用fun函数即可。
如果为'+' || '-' ,则需要将左括号之前的操作符全部输出。
如果为')' 则需要将'('之前的操作符输出,并且最终将'('也输出。
如果为'(',则直接压入栈中即可。
最后注意字符串的数字可能不是一位的,所以在插入数字时需要看一看后一位是否也是数字。
#牛客创作赏金赛#牛客网刷题记录 文章被收录于专栏
本人认为值得记录的一些题
