class ExpValue {
public:
typedef long long int T;
string trim(string& input) {
string ret;
for (int i = 0; i < input.size(); i++) {
if (input[i] != ' ')ret.push_back(input[i]);
}
return ret;
}
T getValue(string& input) {
string s = trim(input); s.push_back('#');
stack<char> sign; sign.push('#');
stack<T> num;
int n = s.size();
int cnt = 1;
for (int i = 0; i < n; i++) {
if (isalnum(s[i])) {
T v = 0;
while (i < n && isalnum(s[i])) {
v = v * 10 + s[i] - '0';
i++;
}
num.push(v); i--;
cnt = 0;
}
else {
char flag;
while ((flag = getPriority(sign.top(), s[i])) == '>') {
T b = num.top(); num.pop();
T a = num.top(); num.pop();
num.push(getFun(a, b, sign.top()));
sign.pop();
}
if (flag == '<') {
if(cnt && (s[i] == '-' || s[i] == '+')){
num.push(0);
}
sign.push(s[i]);
cnt++;
}
else if (flag == '=') {
sign.pop();
}
}
}
return num.top();
}
T getFun(T a, T b, char sign) {
cout << a << " " << sign << " " << b << endl;
switch (sign)
{
case '+':return a + b;
case '-':return a - b;
case '*':return a * b;
case '/':return a / b;
default:break;
}
return 0;
}
char getPriority(char a, char b) {
int id = signId(a), id2 = signId(b);
return _exp_priority[id][id2];
}
private:
char _exp_priority[7][7] =
{
'>', '>', '<', '<', '<', '>', '>',
'>', '>', '<', '<', '<', '>', '>',
'>', '>', '>', '>', '<', '>', '>',
'>', '>', '>', '>', '<', '>', '>',
'<', '<', '<', '<', '<', '=', ' ',
'>', '>', '>', '>', ' ', '>', '>',
'<', '<', '<', '<', '<', ' ', '='
};
int signId(char ch) {
switch (ch)
{
case '+':return 0;
case '-':return 1;
case '*':return 2;
case '/':return 3;
case '(':return 4;
case ')':return 5;
case '#':return 6;
default:
return -1;
}
}
};
表达式求值
最新推荐文章于 2024-10-07 19:01:55 发布