Использование функций с формой RPNC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Использование функций с формой RPN

Сообщение Anonymous »

Я пытаюсь преобразовать математические выражения в RPN, а затем выполнить на них символьное дифференцирование, однако у меня застряли некоторые функции, такие как sin() cos() tan()... ln() sqrt() и т. д. Мой анализатор выражений работает только для более простых случаев, например, из вики RPN:

Код: Выделить всё

3+4*2/(1-5)^2^3
выдает следующее:

Код: Выделить всё

342*15-23^^/+
Однако, когда речь идет о более сложной формуле, например:

Код: Выделить всё

sin(2*x^2+6)-(cos(x)/(1-x))
Я тоже не могу создать RPN вручную. Мое ныне работающее минималистское решение снова реализовано в соответствии с алгоритмом, определенным в Wiki алгоритма Shunting-Yard.

Код: Выделить всё

std::string ParseExpression(const std::string &expr) {
std::string ops = "-+/*^";

std::stringstream output;
std::stack 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 

Подробнее здесь: [url]https://stackoverflow.com/questions/24279027/usage-of-functions-with-rpn-form[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»