#include<bits/stdc++.h> |
using namespace std; |
void cspace( int &f) //输出 |
{ |
if (f) |
{ |
cout<< " " ; |
f=0; |
} |
} |
int zhengfu( char c) //判断是否是+、-号 |
{ |
if (c== '+' ||c== '-' ) |
return 1; |
return 0; |
} |
int num( char c) //判断是否是数字或小数点 |
{ |
if ((c>= '0' &&c<= '9' )||c== '.' ) |
return 1; |
return 0; |
} |
int youxian( char a, char b) //符号优先级 |
{ |
if (b== ')' ) |
return 1; |
if (a== '(' ||b== '(' ) |
return 0; |
switch (b) |
{ |
case '+' : |
case '-' : |
return 1; |
case '*' : |
case '/' : |
switch (a) |
{ |
case '*' : |
case '/' : |
return 1; |
case '+' : |
case '-' : |
return 0; |
} |
} |
} |
int main() |
{ |
char a[21],s[21]; |
cin>>a; |
int length= strlen (a),m=0,flag=0; //m是栈的下标,flag记录空格 |
for ( int i=0; i<length; i++) |
{ |
if (zhengfu(a[i])&&!num(a[i-1])&&a[i-1]!= ')' ) |
{ |
if (a[i]== '-' ) //正号不输出 |
{ |
cspace(flag); |
cout<< "-" ; |
} |
} |
else if (num(a[i])) //数字直接输出 |
{ |
cspace(flag); |
cout<<a[i]; |
} |
else |
{ |
if (m) |
{ |
if (a[i]== ')' ) |
while (m--) |
{ |
if (s[m]== '(' ) |
break ; |
cout<< " " <<s[m]; |
} |
else |
{ |
while (m) |
{ |
if (youxian(s[m-1],a[i])) |
cout<< " " <<s[--m]; |
else break ; |
} |
s[m++]=a[i]; |
} |
} |
else s[m++]=a[i]; |
for ( int j=0; j<m; j++) |
if (s[j]!= '(' ) |
{ |
flag=1; |
break ; |
} |
} |
} |
while (m--) |
cout<< " " <<s[m]; |
return 0; |
} |