• hdu 3596 表达式求值


      1 #include <iostream>
    2 #include <stack>
    3 #include <string.h>
    4 #include <stdio.h>
    5 #include <cmath>
    6 using namespace std;
    7
    8 const int maxx=10000;
    9 const int inf=0x7fffffff;
    10
    11 int precede(char c)
    12 {
    13 switch(c)
    14 {
    15 case '+':
    16 case '-':return 1;
    17 case '^':
    18 case '*':
    19 case '/':return 2;
    20 default:return 0;
    21 }
    22 }
    23
    24 double getvalue(char c,double a,double b)
    25 {
    26 switch(c)
    27 {
    28 case '+':return b+a;
    29 case '-':return b-a;
    30 case '*':return b*a;
    31 case '/':if(a==0) return inf; return b/a;
    32 case '^':return pow(b,a);
    33 }
    34 }
    35
    36 bool isnum(char c)
    37 {
    38 if((c>='0' && c<='9')|| c=='.') return 1;
    39 else return 0;
    40 }
    41
    42 void change(char c[],char s[])
    43 {
    44 int i,cnt=-1,len=strlen(c);
    45 for(i=0;i<len;)
    46 {
    47 if((c[i]=='+' || c[i]=='-') && cnt==-1)
    48 {
    49 s[++cnt]='0';
    50 s[++cnt]=c[i];
    51 i++;
    52 }
    53 else if(c[i]=='(')
    54 {
    55 s[++cnt]=c[i];
    56 i++;
    57 while(c[i]==' ') i++;
    58 if(c[i]=='+' || c[i]=='-')
    59 {
    60 s[++cnt]='0';
    61 s[++cnt]=c[i];
    62 i++;
    63 }
    64 }
    65 else if(c[i]==' '||c[i]=='\t') i++;
    66 else {s[++cnt]=c[i];i++;}
    67 }
    68 s[++cnt]='\0';
    69 }
    70
    71 double strtonum(char s[],int &i)
    72 {
    73 double cas=0.1,dot=0.0,a=0.0;
    74 if(s[i]=='.')
    75 {
    76 i++;
    77 while(isnum(s[i]))
    78 {
    79 dot=dot+(s[i]-'0')*cas;
    80 cas*=0.1;
    81 i++;
    82 }
    83 }
    84 else
    85 {
    86 a=(s[i]-'0')*1.0;
    87 i++;
    88 while(isnum(s[i]) && s[i]!='.')
    89 {
    90 a=a*10.0+(s[i]-'0')*1.0;
    91 i++;
    92 }
    93 if(s[i]=='.')
    94 {
    95 i++;
    96 while(isnum(s[i]))
    97 {
    98 dot=dot+(s[i]-'0')*cas;
    99 cas*=0.1;
    100 i++;
    101 }
    102 }
    103 }
    104 return a+dot;
    105 }
    106
    107 double result(char s[])
    108 {
    109 stack <char> ope;
    110 stack <double> nd;
    111 char c;
    112 double a,b,ans;
    113 int i=0;
    114 bool flag=0;
    115 if(s[i]=='+') i++;
    116 else if(s[i]=='-') {i++;a=strtonum(s,i);nd.push(-a);}
    117 while(s[i]!='\0')
    118 {
    119 if(isnum(s[i]))
    120 {
    121 a=strtonum(s,i);
    122 nd.push(a);
    123 }
    124 else if(s[i]=='(')
    125 {
    126 ope.push(s[i]);
    127 i++;
    128 if(s[i]=='+') i++;
    129 else if(s[i]=='-') {i++;a=strtonum(s,i);nd.push(-a);}
    130
    131 }
    132 else if(s[i]==')')
    133 {
    134 while(ope.top()!='(')
    135 {
    136 c=ope.top();ope.pop();
    137 a=nd.top();nd.pop();
    138 b=nd.top();nd.pop();
    139 ans=getvalue(c,a,b);
    140
    141 if(ans==inf)
    142 { flag=1;break;}
    143 nd.push(ans);
    144 }
    145 ope.pop();
    146 i++;
    147 }
    148 else if(s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/' || s[i]=='^')
    149 {
    150 if(!ope.empty() && precede(s[i])<=precede(ope.top()))//若当前符号优先级比栈里边的小,则一直弹栈
    151 {
    152 c=ope.top();ope.pop();
    153 a=nd.top();nd.pop();
    154 b=nd.top();nd.pop();
    155 ans=getvalue(c,a,b);
    156
    157 if(ans==inf)
    158 {flag=1;break;}
    159 nd.push(ans);
    160 }
    161 else
    162 {
    163 ope.push(s[i]);
    164 i++;
    165 }
    166 }
    167 else i++;
    168 }
    169 while(!ope.empty())
    170 {
    171 c=ope.top();ope.pop();
    172 a=nd.top();nd.pop();
    173 b=nd.top();nd.pop();
    174 ans=getvalue(c,a,b);
    175 if(ans==inf)
    176 {flag=1;break;}
    177 nd.push(ans);
    178 }
    179 if(flag==1) return inf;
    180 return nd.top();
    181 }
    182
    183 bool expression(char str[])
    184 {
    185 int len = strlen(str);
    186 bool flag = false;
    187 int zk = 0, yk = 0;
    188 if(len == 1)
    189 {
    190 if(str[0]>='0'&&str[0]<='9') return 1;
    191 else return 0;
    192 }
    193 for(int i = 0; i < len-1; i++)
    194 {
    195 if(str[i] == ' ') continue;
    196 else if(str[i]>='0'&&str[i]<='9')
    197 {
    198 if(str[i+1]=='(')
    199 {
    200 flag = true;
    201 break;
    202 }
    203 }
    204 else if(str[i] == '(')
    205 {
    206 if(str[i+1]==')')
    207 {
    208 flag = true;
    209 break;
    210 }
    211 zk++;
    212 }
    213 else if(str[i] == ')')
    214 {
    215 if(zk == 0)
    216 {
    217 flag = true;
    218 break;
    219 }
    220 if(str[i+1]>='0'&&str[i+1]<='9')
    221 {
    222 flag = true;
    223 break;
    224 }
    225 if(str[i+1]=='(')
    226 {
    227 flag = true;
    228 break;
    229 }
    230 zk--;
    231 }
    232 else//+-*/
    233 {
    234 if(str[i+1]=='+'||str[i+1]=='-'||str[i+1]=='*'||str[i+1]=='/' || str[i+1]=='^')
    235 {
    236 flag = true;
    237 break;
    238 }
    239 if(str[i+1]==')')
    240 {
    241 flag = true;
    242 break;
    243 }
    244 }
    245 }
    246 if(str[len-1]=='(') return 0;
    247 else if(str[len-1]==')'&& zk!=1) return 0;
    248 else if(str[len-1]=='+'||str[len-1]=='-'||str[len-1]=='*'||str[len-1]=='/'||str[len-1]=='^') return 0;
    249 else if(str[len-1]!=')'&&zk) return 0;
    250 else if(flag) return 0;
    251 else return 1;
    252 }
    253
    254 int main()
    255 {
    256 char s[maxx+10],c[maxx+10];
    257 double ans;
    258 // freopen("in.txt","r",stdin);
    259 while(gets(c))
    260 {
    261 change(c,s);
    262 if(!expression(s)){printf("The teacher is so lazy!\n");continue;}
    263 ans=result(s);
    264 if(ans==inf)
    265 printf("The teacher is so lazy!\n");
    266 else
    267 printf("%.8lf\n",ans);
    268
    269 }
    270 return 0;
    271 }
  • 相关阅读:
    C# 字段 属性 方法 三霸主齐上阵
    C# 项目之总结,浓缩才是精华
    C# 语法 重中之重
    岁月流逝,C#成为我们IT精英永恒不变的经典
    pv:快餐厅4类职员正确并发运行的程序——用pv实现有向图的前驱关系哦!
    pv错题:用pv操作实现旅客,汽车之间的同步关系——北航2018考研计算机!!!!!!!!我还很不熟练,奋斗吧少年!!!!!!
    windows 的 DMA
    pv打卡:生产者消费者问题扩展——>南航2002pv习题哦
    冷门的OS知识:中断——这个我多大熟练qwq!
    Unix混合索引结构_文件系统_文件的组织_文件的物理结构_多级索引文件——>相关的小计算题!!!!!!重点重点重点!!!!!!
  • 原文地址:https://www.cnblogs.com/inpeace7/p/2430520.html
Copyright © 2020-2023  润新知