题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
char c;
int pos = 0;
stack<char> C;
stack<int> I;
bool getc(string s) {
if (pos < s.size()) {
c = s[pos++];
return 1;
} else
return 0;
}
void cal() {
char op = C.top();
C.pop();
int n2 = I.top();
I.pop();
int n1 = I.top();
I.pop();
int val;
switch (op) {
case '+':
val = n1 + n2;
break;
case '-':
val = n1 - n2;
break;
case '*':
val = n1 * n2;
break;
case '/':
val = n1 / n2;
break;
}
I.push(val);
}
void E(string s) {
T(s);
while (c == '+' || c == '-') {
C.push(c);
getc(s);
T(s);
cal();
}
return;
}
void T(string s) { //
F(s);
while (c == '*' || c == '/') {
C.push(c);
getc(s);
F(s);
cal();
}
return;
}
void F(string s) {
if (c == '(') {
getc(s);
E(s);
getc(s);
return;
}
//此处必然是数字
int val = 0;
while (c >= '0' && c <= '9') {
val = val * 10 + (c - '0');
if (!getc(s))
break;
}
I.push(val);
}
int solve(string s) {
// write code here
if (!getc(s))
return 0;
E(s);
return I.top();
}
};
编译技术中自顶向下递归子程序法来解,懂得编译原理的牛牛们一定不陌生。
由于不需要考虑语法错误,逻辑性上就可以简化部分。
虽然调用的函数块过多,但逻辑是极为清晰的。
函数分为solve、E(多项式)、T(加减数)、F(因子)
E函数用于处理各个项之间的加减运算,
T用来处理乘除法,
F用来处理具体因子或者括号。
OPPO公司福利 1176人发布