string itop(string ex)
{
int x, n = 0, c = 0;
stack s;
char check;
string nw;
if (ex.empty())
{
string empty_ex = "Expression is Empty.";
return empty_ex;
}
for (x = 0; x < ex.length(); x++)
{
if (ex[x] == '(' || ex[x] == '{' || ex[x] == '[')
{
s.push(ex[x]);
n++;
continue;
}
if (ex[x] == '*' || ex[x] == '/')
{
s.push(ex[x]);
continue;
}
if (ex[x] == '+' || ex[x] == '-')
{
check = s.pop();
if (check == '*' || check == '/')
{
nw[c] = check;
c++;
s.push(ex[x]);
continue;
}
s.push(check);
s.push(ex[x]);
continue;
}
if (ex[x] == ')')
{
check = s.pop();
while (check != '(' && check != '{' && check != '[')
{
nw[c] = check;
c++;
check = s.pop();
}
if (check != '(')
{
cout << "Round Bracket is misplaced." << endl;
n++;
s.push(check);
continue;
}
if (check == '(')
{
n--;
continue;
}
}
if (ex[x] == '}')
{
check = s.pop();
while (check != '(' && check != '{' && check != '[')
{
nw[c] = check;
c++;
check = s.pop();
}
if (check != '{')
{
cout << "Curly Bracket is misplaced." << endl;
n++;
s.push(check);
continue;
}
if (check == '{')
{
n--;
continue;
}
}
if (ex[x] == ']')
{
check = s.pop();
while (check != '(' && check != '{' && check != '[')
{
nw[c] = check;
c++;
check = s.pop();
}
if (check != '[')
{
cout << "Square Bracket is misplaced." << endl;
n++;
s.push(check);
continue;
}
if (check == '[')
{
n--;
continue;
}
}
check = s.pop();
s.push(check);
cout << ex[x] << "\t"<<check;
nw[c] = ex[x];
// c++;
}
return nw;
}
int main()
{
cout << itop("(2+2)");
return 0;
}
Когда значения массива char (строки) отображаются явно, они работают нормально, но когда дело доходит до сохранения одних и тех же символов в строке, это вызывает исключение в виде бесконечного цикла. Почему это так ? По сути, считается, что при обнаружении операнда он отправляется в строку nw , а если оператор найден, то он отправляется в стек.