2014-06-18 3 views
0

수학 표현식을 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 수식에 삼각법 및 기타 기능을 포함하고 올바르게 처리하려면 어떻게해야합니까?

답변

1

RPN은 연산자와 마찬가지로 함수 (삼각법 포함)에 대해 동일하게 작동합니다. 삼각법의 경우 단일 인수 만 있습니다 (일반적으로 두 개가있는 연산자와 달리).

2x2^*6+_sin_x_cos_1x-/- 

같은

귀하의 예는

sin(2*x^2+6)-(cos(x)/(1-x)) 

가 될 것을 나는 명확성을 위해 전후 죄 주위에 밑줄 및 COS ​​기능을 넣어.

연산자를 인수가 두 개인 함수와 삼각 함수를 하나의 인수로 생각하면 좀 더 추상적으로 생각하면 조금 더 이해할 수 있습니다. 함수는 항상 인수 뒤에오고 스택의 앞의 인수를 평가합니다. - 순서를 뒤집는 것 (마지막에서 처음으로). 연산자를 함수로 변경하면 (그리고 바이너리에 "b"를 추가하고 단항에 대해 "u"를 추가하면) 아래에있는 것이됩니다. RPN은 "b"(두 개의 인수)가있는 모든 것에 대해 앞의 두 인수가 함수에서 평가됩니다. "u"(하나의 인수)로 끝나는 함수의 경우 앞의 인수가 평가됩니다.

2x2_powb__multb_6_plusb__sinu_x_cosu_1x_minusb__divb__minusb_ 
+0

대단히 고맙습니다! – Wrath