int in_stack_priority(char c)
{
int ret;
switch (c)
{
case '+':
case '-': ret = 2;break;
case '*':
case '/': ret = 4; break;
case '(': ret = 0; break;
}
return ret;
}
int out_stack_priority(char c)
{
int ret;
switch (c)
{
case '+':
case '-': ret = 1;break;
case '*':
case '/': ret = 3; break;
case '(': ret = 5; break;
case ')': ret = 0; break;
}
return ret;
}
vector infix_to_postfix(vector& infix)
{
vector postfix;
stack ostack;
string temp;
for (const auto& x : infix)
{
if (isdigit(x[0]))
{
postfix.push_back(x);
}
else
{
while (!ostack.empty() && in_stack_priority(ostack.top()[0]) > out_stack_priority(x[0]))
{
temp = ostack.top(), ostack.pop();
postfix.push_back(temp);
}
if (ostack.empty() || in_stack_priority(ostack.top()[0]) < out_stack_priority(x[0]))
{
ostack.push(x);
}
else
{
ostack.pop();
}
}
}
while (!ostack.empty())
{
temp = ostack.top(), ostack.pop();
postfix.push_back(temp);
}
return postfix;
}
int main()
{
vector infix = { "(", "3", "+", "1", ")", "*", "(", "4", "*", "3", ")" };
vector postfix = infix_to_postfix(infix);
for (const auto& x : postfix)
{
cout << x << " " << endl;
}
}