#include<bits/stdc++.h>
using namespace std;
bool isOperator(char c){
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='^'){
return true;
}
else{
return false;
}
}
int precedence(char c){
if(c=='^')return 3;
else if(c=='*' ||c=='/')return 2;
else if(c=='+' || c=='-')return 1;
else return -1;
}
string infixToPostfix(stack<char>s,string infix){
string postfix="";
int l=postfix.length();
for(int i=0;i<l;i++){
if( ( infix[i]>='a' && infix[i]<='z' ) ||
( infix[i]>='A' && infix[i]<='Z' ) ){
postfix+=infix[i];
}
else if(infix[i]=='('){
s.push(infix[i]);
}
else if(infix[i]==')'){
while( (!s.empty()) && (s.top()!='(' ) ){
char temp=s.top();
postfix+=temp;
s.pop();
}
if(s.top()=='('){
s.pop();
}
}
else if( isOperator(infix[i]) ){
if(s.empty()){
s.push(infix[i]);
}
else{
if( precedence(infix[i])>precedence(s.top()) ){
s.push(infix[i]);
}
else if( (precedence(infix[i])==precedence(s.top())) ){
s.push(infix[i]);
}
else{
while( (!s.empty()) && ( precedence(infix[i])<=precedence(s.top()) ) ){
char t=s.top();
postfix+=t;
s.pop();
}
s.push(infix[i]);
}
}
}
}
while(!s.empty()){
postfix+=s.top();
s.pop();
}
return postfix;
}
int main(){
string infix_exp,postfix_exp;
cout<<"Enter a infix express: "<<endl;
cin>>infix_exp;
stack<char>s;
cout<<"Infix express: "<< infix_exp<<endl;
postfix_exp=infixToPostfix(s,infix_exp);
cout<<"Postfix express is : "<< postfix_exp<<endl;
return 0;
}