poj1400 Complicated Expressions
测试数据没有问题的,但是不知为什么超时
先转为后缀表达式,把括号去掉;再转为中缀表达式,转化成输出形式
转化过程,想清楚了其实很简单
1 #include <string> 2 #include <iostream> 3 using namespace std; 4 int grade(char ch) 5 { 6 switch(ch) 7 { 8 case '*': 9 case '/': 10 return 2; 11 case '+': 12 case '-': 13 return 1; 14 case '(': 15 return 0; 16 } 17 return -1; 18 } 19 void midfix2surfix(string& str) 20 { 21 char stack[251]; 22 string ans=""; 23 int top=0; 24 stack[top]=' '; 25 int i; 26 for(i=0;i<str.length();i++) 27 { 28 if(str[i]>='a' && str[i]<='z') 29 { 30 ans+=str[i]; 31 continue; 32 } 33 switch(str[i]) 34 { 35 case '(': 36 top++; 37 stack[top]=str[i]; 38 break; 39 case ')': 40 while(stack[top]!='(') 41 { 42 ans+=stack[top]; 43 top--; 44 } 45 top--; 46 break; 47 default: 48 if(grade(str[i])>grade(stack[top])) 49 { 50 top++; 51 stack[top]=str[i]; 52 break; 53 } 54 while(grade(str[i])<=grade(stack[top])) 55 { 56 ans+=stack[top]; 57 top--; 58 } 59 top++; 60 stack[top]=str[i]; 61 break; 62 } 63 } 64 while(top>0) 65 { 66 ans+=stack[top]; 67 top--; 68 } 69 str=ans; 70 } 71 void surfix2midfix(string& str) 72 { 73 string stack[251]; 74 string str1,str2,str3; 75 int r[251]; 76 int top=0; 77 r[top]=0; 78 int i; 79 for(i=0;i<str.length();i++) 80 { 81 if(str[i]>='a' && str[i]<='z') 82 { 83 top++; 84 stack[top]=str[i]; 85 r[top]=0; 86 continue; 87 } 88 switch(str[i]) 89 { 90 case '+': 91 str2=stack[top]; 92 top--; 93 str1=stack[top]; 94 stack[top]=str1+"+"+str2; 95 r[top]=1; 96 break; 97 case '-': 98 str2=stack[top]; //after topped, corresponding operator is r[top+1]; a-b, b is this 99 top--; 100 str1=stack[top]; 101 if(r[top+1]==1) 102 stack[top]=str1+"-"+"("+str2+")"; 103 else 104 stack[top]=str1+"-"+str2; 105 r[top]=1; 106 break; 107 case '*': 108 str2=stack[top]; 109 top--; 110 str1=stack[top]; 111 if(r[top+1]==1) 112 str2="("+str2+")"; 113 if(r[top]==1) 114 str1="("+str1+")"; 115 stack[top]=str1+"*"+str2; 116 r[top]=2; 117 break; 118 case '/': 119 str2=stack[top]; 120 top--; 121 str1=stack[top]; 122 if(r[top+1]==1 || r[top+1]==2) 123 str2="("+str2+")"; 124 if(r[top]==1) 125 str1="("+str1+")"; 126 stack[top]=str1+"/"+str2; 127 r[top]=2; 128 break; 129 } 130 } 131 str=stack[top]; 132 } 133 int main() 134 { 135 int n,i,j; 136 string str; 137 cin>>n; 138 for(i=0;i<n;i++) 139 { 140 cin>>str; 141 midfix2surfix(str); 142 surfix2midfix(str); 143 cout<<str<<endl; 144 } 145 146 return 0; 147 }