// 判断是否是表达式 boolisExpr(string s){ bool ret = true; for (int i = 0; i < s.size(); ++i) { if (!((s[i] >= '0' && s[i] <= '9') || s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '(' || s[i] == ')')) { ret = false; break; } } return ret; }
// 判断是否是操作符 boolisOperator(constchar& op){ return (op == '+' || op == '-' || op == '*' || op == '/'); }
// 返回运行符的优先级 intpriority(constchar& op){ if (op == '*' || op == '/') return2; elseif (op == '+' || op == '-') return1; else return0; }
// 中缀表达式转换成后缀表达式 voidinfix2Suffix(conststring& src, string& dst){ stack<char> s; for (int i = 0; i < src.size(); ++i) { // 如果是数字,直接输出 if (src[i] <= '9' && src[i] >= '0') dst += src[i]; // 如果是左括号,压入栈中 if (src[i] == '(') s.push(src[i]); // 如果是操作符 while (isOperator(src[i])) { // 当栈为空或栈顶为左括号或当前操作符优先级高于栈顶操作符优先级时,压入栈中,并退出while循环 if (s.empty() || s.top() == '(' || priority(src[i]) > priority(s.top())) { s.push(src[i]); break; } // 否则,将栈顶元素出栈,并继续while循环 else { dst += s.top(); s.pop(); } } // 如果是右括号,则不停地执行出栈操作直至栈顶元素为左括号,最后丢弃掉左括号 if (src[i] == ')') { while (src[i] != '(') { dst += s.top(); s.pop(); } s.pop(); } } // 遍历结束后将栈中剩下元素输出 while (!s.empty()) { dst += s.top(); s.pop(); } }
// 求解 intgetResult(conststring& src){ string dst; stack<int> s; infix2Suffix(src, dst); for (int i = 0; i < dst.size(); ++i) { if (dst[i] <= '9' && dst[i] >= '0') s.push(dst[i] - '0'); else { int a = s.top(); s.pop(); int b = s.top(); s.pop(); int c = 0; if (dst[i] == '+') c = b + a; elseif (dst[i] == '-') c = b - a; elseif (dst[i] == '*') c = b * a; elseif (dst[i] == '/') c = b / a; s.push(c); } } return s.top(); }