Как обрабатываются скобки в обратной польской нотации?
Пытаюсь реализовать обратную польскую запись. Со знаками +, -, /, * работает верно. Но не работает если в обрабатываемую строку добавить скобки. Не могу понять в чем ошибка, подскажите пожалуйста.
Код для обработки знаков работает по такому алгоритму:
Если встречается операнд, то он помещается в выходную строку
Если алгоритм встречает оператор:
2.1. Стек пуст - оператор помещается в стек
2.2. Если входящий оператор имеет более высокий приоритет, чем тот оператор, что в настоящее время находится на вершине стека, входящий оператор помещается на вершину стека
2.3. Если входящий оператор имеет такой же приоритет, верхний оператор извлекается из стека и выводится в очередь, а входящий оператор помещается в стек
2.4. Если приоритет входящего оператора ниже, верхний оператор извлекается из стека и выводится в очередь, после чего входящий оператор сравнивается с новой вершиной стека
- Когда вся строка проанализирована операторы переносятся в выходную строку
Для обработки скобок я решил дополнить алгоритм:
Если встретили '(' - помещаем её в стек.
Если встретили ')', - извлекаем символы из стека в выходную строку пока не встретится '('.
bool is_number(char ch)
{
bool result = false;
if (ch >= '0' && ch <= '9')
result = true;
return result;
}
int prioritet(char ch)
{
int prioritet;
switch (ch)
{
case '*':
case '/':
return 4;
case '-':
case '+':
return 3;
case '(':
return 2;
case ')':
return 1;
}
return 0;
}
string Reverse_Polish_Natation(string input_string)
{
char ch;
string output_string;
stack<char> stek_operator;
for (int i = 0; i < input_string.size(); ++i)
{
ch = input_string[i];
if (is_number(ch) == true)
{
while (is_number(ch) == true)
{
output_string.push_back(ch);
i++;
ch = input_string[i];
}
output_string.push_back(' ');
}
else if (ch == ' ')
{
while (input_string[i] == ' ')
i++;
i--;
}
else if (ch == '+' || ch == '-' || ch == '*' || ch == '/')
{
while (true)
{
if (stek_operator.empty() || prioritet(ch) > prioritet(stek_operator.top()) || prioritet(ch) == 2)
{
stek_operator.push(ch);
break;
}
if (prioritet(ch) == 1)
{
while (prioritet(stek_operator.top()) == 2)
{
output_string.push_back(stek_operator.top());
stek_operator.pop();
}
}
if (prioritet(ch) == prioritet(stek_operator.top()))
{
output_string.push_back(stek_operator.top());
output_string.push_back(' ');
stek_operator.pop();
stek_operator.push(ch);
break;
}
if (prioritet(ch) < prioritet(stek_operator.top()))
{
output_string.push_back(stek_operator.top());
output_string.push_back(' ');
stek_operator.pop();
}
}
}
}
while (!stek_operator.empty())
{
ch = stek_operator.top();
stek_operator.pop();
output_string.push_back(ch);
output_string.push_back(' ');
}
cout << output_string << endl;
return output_string;
}
int main()
{
string s = "(2 + 3) * 4";
Reverse_Polish_Natation(s);
}