#include <iostream>
#include <string>
#include <stack>
using namespace std;
string zhong;
string hou;
string qian;
int you[4][5]={
{1,1,0,0,1},
{1,1,0,0,1},
{1,1,1,1,1},
{1,1,1,1,1}
};
int get_num(char w)
{
if(w=='+') return 0;
if(w=='-') return 1;
if(w=='*') return 2;
if(w=='/') return 3;
if(w=='('||w==')') return 4;
}
int cmp1(char a,char b)
{
int n1,n2;
n1=get_num(a);
n2=get_num(b);
return you[n1][n2];
}
void get_hou()
{
stack<char> fu;
for(int i=0;i<zhong.length();i++)
{
if(zhong[i]<='z'&&zhong[i]>='a')
{
hou+=zhong[i];
continue;
}
if(zhong[i]=='(')
{
fu.push(zhong[i]);
continue;
}
if(zhong[i]==')')
{
char temp;
for(;fu.top()!='(';)
{
temp=fu.top();
fu.pop();
hou+=temp;
}
fu.pop();
continue;
}
if(fu.empty()==1)
{
fu.push(zhong[i]);
continue;
}
if(cmp1(zhong[i],fu.top())==1)
{
//比栈顶高
fu.push(zhong[i]);
continue;
}
else
{
//比栈顶低
for(;cmp1(zhong[i],fu.top())==0;)
{
hou+=fu.top();
fu.pop();
if(fu.empty()) break;
}
fu.push(zhong[i]);
}
}
for(;!fu.empty();)
{
hou+=fu.top();
fu.pop();
}
}
void get_qian()
{
stack<char> fu;
for(int i=zhong.length()-1;i>=0;i--)
{
if(zhong[i]>='a'&&zhong[i]<='z')
{
qian+=zhong[i];
continue;
}
if(zhong[i]==')')
{
fu.push(zhong[i]);
continue;
}
if(zhong[i]=='(')
{
for(;fu.top()!=')';)
{
qian+=fu.top();
fu.pop();
}
fu.pop();
continue;
}
if(fu.empty())
{
fu.push(zhong[i]);
continue;
}
if(cmp1(zhong[i],fu.top())==1)
{
//比栈顶高
fu.push(zhong[i]);
}
else
{
//比栈顶低
for(;cmp1(zhong[i],fu.top())==0;)
{
qian+=fu.top();
fu.pop();
if(fu.empty()) break;
}
fu.push(zhong[i]);
}
}
for(;!fu.empty();)
{
qian+=fu.top();
fu.pop();
}
}
string reverse_str(string str)
{
string res;
for(int i=str.length()-1;i>=0;i--)
{
res+=str[i];
}
return res;
}
int main(int argc, char** argv) {
//中缀转后缀
cin>>zhong;
get_hou();
cout<<hou<<endl;
//中缀转前缀
get_qian();
qian=reverse_str(qian);
cout<<qian<<endl;
return 0;
}
中缀转后缀,转前缀
最新推荐文章于 2024-09-11 15:28:58 发布