Поиск пары скобок - C (СИ)
Формулировка задачи:
пишу строковый калькулятор, никак не получается написать алгоритм поиска пары скобок помогите пожалуйста... подфункция должна выглядеть примерно так:
т.е. по указателям обратно возвращать должна найденные скобки, а возвращаемое значение - код ошибки (0 - скобки не найдены, 1 - скобки найдены, 2 - переданная строка не валидная), предполагается что туда уже будет подаваться строка без посторонних символов и с одинаковым количеством открывающих и закрывающих скобок (отсеется на предыдущих этапах парсинга)
unsigned parentheses(const char* expr, const char** open, const char** close);
пожалуйста помогите !!! уже всю голову сломал несколько дней думаю не могу никак сделать этот алгоритм !!!
вот если надо моя попытка, но не правильная все равно я знаю...
unsigned parentheses(const char* expr, const char** open, const char** close)
{
if (!expr) return 2;
*open = strchr(expr, '(');
for (const char* tmp = strchr(expr, '('); tmp; tmp = strchr(tmp, '('))
{
*close = strchr(tmp++, ')');
if (*close < tmp) break;
}
if (*open && *close) return 1;
return 0;
}Решение задачи: «Поиск пары скобок»
textual
Листинг программы
int strtofunc(const char* str, char** endptr)
{
if (strchr("^*/+-()", *str))
{
if (endptr) *endptr = (char*)str + 1;
switch (*str)
{
case '^': return 5;
case '*':
case '/': return 4;
case '+':
case '-': return 3;
case '(':
case ')': return 2;
}
}
if (!(*str >= 'a' && *str <= 'z')) return 0;
const char* functions[] = { "sin", "cos", "tg", "ctg", "ln", "log10" };
for (auto tmp : functions)
{
size_t len = strlen(tmp);
for (size_t i = 0; i < len; i++)
if (str[i] != tmp[i]) break;
else
if (i + 1 == len)
{
if (endptr) *endptr = (char*)&str[i + 1];
return 1;
}
}
endptr = NULL;
return 0;
}
Объяснение кода листинга программы
- Функция
strtofuncпринимает два аргумента: строкуstrи указатель на переменнуюendptr. - Сначала проверяется, есть ли в строке символ, который может быть функцией (скобкой, знаком плюса или минуса, звездочкой, дефисом, логарифмом, десятичной запятой или вертикальной линией).
- Если такой символ есть, функция возвращает соответствующее число (5 для вертикальной линии, 4 для звездочки или дефиса, 3 для плюса или минуса, 2 для скобок).
- Если символа функции нет, проверяется, является ли первый символ строки буквой.
- Если это так, то функция сравнивает каждый символ строки с соответствующим символом в массиве функций.
- Если все символы совпадают, функция возвращает 1, указывая на то, что функция находится в массиве функций.
- Если символы не совпадают, функция продолжает искать функцию.
- Если ни одна функция не найдена, функция возвращает 0.