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 }
posted @ 2012-10-12 20:41  sidereal  Views(240)  Comments(0)    收藏  举报