수학 표현식을 RPN으로 변환 한 다음 상징적 인 차별화를 수행하려고하지만 sin() cos() tan() ... ln()과 같은 일부 함수가 붙어 있습니다. SQRT() 등 내 표현 파서 만 RPN 위키에서처럼, 더 간단한 경우에 작동합니다RPN 형식의 함수 사용
3+4*2/(1-5)^2^3
는 다음과 같은 생산 :
342*15-23^^/+
그것을 더 복잡한 공식에 관해서 그러나 때, like :
sin(2*x^2+6)-(cos(x)/(1-x))
RPN을 손으로 만들 수도 없습니다. 나의 현재 미니멀리스트 솔루션은 Shunting-Yard 알고리즘의 Wiki에 정의 된 알고리즘에 따라 다시 구현됩니다.
std::string ParseExpression(const std::string &expr) {
std::string ops = "-+/*^";
std::stringstream output;
std::stack<int> stack;
typedef std::string::const_iterator StringIterator;
for (StringIterator TOKEN = expr.cbegin(), END = expr.cend(); TOKEN != END; ++TOKEN) {
const char c = *TOKEN;
size_t idx = ops.find(c);
if (idx != std::string::npos) {
if (stack.empty()) {
stack.push(idx);
}
else {
while (!stack.empty()) {
int prec2 = stack.top()/2;
int prec1 = idx/2;
if (prec2 > prec1 || (prec2 == prec1 && c != '^')) {
output << ops[stack.top()];
stack.pop();
}
else {
break;
}
}
stack.push(idx);
}
} else if (c == '(') {
stack.push(-2);
} else if (c == ')') {
while (stack.top() != -2) {
char op = stack.top();
stack.pop();
output << ops[op];
}
stack.pop();
} else {
output << c;
}
}
while (!stack.empty()) {
output << ops[stack.top()];
stack.pop();
}
return output.str();
}
실제로 RPN 수식에 삼각법 및 기타 기능을 포함하고 올바르게 처리하려면 어떻게해야합니까?
대단히 고맙습니다! – Wrath