Для этого мне нужно сравнить операторов в строке с старшинства как:
Вы можете сделать что-то подобное, чтобы получить преимущество для каждого персонажа:
int get_precedence (char c) {
switch (c) {
case '+':
case '-': return 3;
case '*':
case '/': return 2;
case '(':
case ')': return 1;
default: return -1;
}
}
Это делает его очень простым в добавлении дополнительных символов по мере необходимости ,
Однако у вас все еще есть некоторые проблемы. Например, как вы скажете унарное отрицание от вычитания? Вам нужно посмотреть на контекст, потому что ответ будет зависеть от того, что было раньше. Работа с инфиксной нотой - hard.
Для этого вам необходимо написать recursive descent parser или использовать shunting yard algorithm. В любом случае, это будет несколько сотен строк hard. Затем вам нужно будет решить, оцениваете ли вы из абстрактного дерева синтаксиса или компилируете в байтовый код.
Я пишу код для решения арифметических выражений как: 4+3-2*6*(3+4/2)
Если вы хотите, чтобы решить, что в легком пути, вы должны найти предварительно существующую библиотеку. TinyExpr - одно из таких решений. Он является открытым исходным кодом и содержится в одном файле исходного кода C. Код для этого будет выглядеть так:
#include "tinyexpr.h"
double answer = te_interp("4+3-2*6*(3+4/2)", 0);
Почему бы просто не сделать свою собственную функцию сравнения? –
Yupp Я мог бы это сделать, но я искал, есть ли другой эффективный способ сделать это! Как я мог определить свои значения ascii для операторов, я знаю, что это невозможно, но что-то похожее на это. –
Также .. Например. арифметического выражения, которое я дал в que. это простая версия. Более сложное арифметическое выражение может включать в себя другие абстрактные операторы типа «$», «%», «^», «@», «&» и т. Д., Причем их операция определяется двумя целыми числами и приоритетом над другими операторами. Вы не можете просто сделать функцию для этого! Для написания этой функции потребуется 100 строк. (Подумайте о выборе 3 операторов для сравнения с n операторами). –