表达式求值
来源:互联网 发布:java入门教程电子书 编辑:程序博客网 时间:2024/06/07 12:18
1 模拟法:
#include <iostream>#include <stdio.h>#include <string.h>#define N 10000using namespace std;int st[N];char sc[N],s[N];int add(int a,int b){return a+b;}int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a<b?a:b;}int main(){ //freopen("biao.txt","r",stdin); int n,i,k,len,t,r,l; scanf("%d",&n); while(n--) { scanf("%s",&s); t=0;r=0; len=strlen(s); for(i=0;i<len;i++) {if(s[i]==',') continue; if(s[i]=='a') { i+=3; sc[t++]='a'; } if(s[i]=='m') { if(s[i+1]=='i') sc[t++]='M'; else if(s[i+1]=='a') sc[t++]='m';i+=3; } if(s[i]=='(') { sc[t++]='('; } if('0'<=s[i] && s[i]<='9') { int temp=s[i]-48; for(k=i+1;s[k]!=','&&k<len&&s[k]!=')';k++) temp=temp*10+(s[k]-48); i=k+1; st[r++]=temp;if(s[i-1]==')' || s[i-1]==',') {i-=2;continue;} int tenp=s[i]-48; for(l=i+1;s[l]!=')'&&l<len&&s[l]!=',';l++) tenp=tenp*10+(s[l]-48); st[r++]=tenp; i=l; } if(s[i]==')') { if(sc[t-2]=='M') { int f=min(st[--r],st[--r]); t-=2; st[r++]=f; } else if(sc[t-2]=='m') { int h=max(st[--r],st[--r]); t-=2; st[r++]=h; } else if(sc[t-2]=='a') { int g=add(st[--r],st[--r]); t-=2; st[r++]=g; } } } printf("%d\n",st[0]); memset(s,'\0',sizeof(s)); } return 0;}
2:递归法:
#include <iostream>#include <cstdio>#include <cstring>#define N 1000using namespace std;char s[N];int t;int max(int a,int b) {return a>b?a:b;}int min(int a,int b) {return a>b?b:a;}int add(int a,int b) {return a+b;}void init(){int i;for(i=0;i<strlen(s);i++)if(s[i]=='m' && s[i+1]=='a') s[i]='M';}int value(char s[],int len){int val,k,i;if('0'<=s[0] && s[0]<='9') {sscanf(s,"%d",&val);return val;}for(k=0,i=0;i<len;i++){if(s[i]=='(') k++;if(s[i]==')') k--;if(k==1 && s[i]==','){if(s[0]=='a') return add(value(s+4,i-4),value(s+i+1,len-i+1));else if(s[0]=='m') return min(value(s+4,i-4),value(s+i+1,len-i+1));else if(s[0]=='M') return max(value(s+4,i-4),value(s+i+1,len-i+1));}}}int main (){//freopen("biao.txt","r",stdin);int n;cin>>n;getchar();while(n--){memset(s,'\0',sizeof(s));cin>>s;init();t=0;cout<<value(s,strlen(s))<<endl;}return 0;}
3 递归精简法:
#include <iostream>#include <cstdio>#include <cstring>#define N 1000using namespace std;char s[N];int t;int max(int a,int b) {return a>b?a:b;}int min(int a,int b) {return a>b?b:a;}int add(int a,int b) {return a+b;}void init(){int i;for(i=0;i<strlen(s);i++)if(s[i]=='m' && s[i+1]=='a') s[i]='M';}int value(){int val,k,i;if(s[t]=='a') {t+=3;return add(value(),value());}if(s[t]=='m') {t+=3;return min(value(),value());}if(s[t]=='M') {t+=3;return max(value(),value());}if(s[t]=='(' || s[t]==')' || s[t]==',') {t+=1;return value();}sscanf(s+t,"%d%n",&val,&k);t+=k;return val;}int main (){//freopen("biao.txt","r",stdin);int n;cin>>n;getchar();while(n--){memset(s,'\0',sizeof(s));cin>>s;init();t=0;cout<<value()<<endl;}return 0;}
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- mysql 定时器 详解
- [Java 3]Java常用语言库之Log4J、Junit及HttpClient
- 淘宝技术发展
- SNMP常用OID
- 细数Objective-C中的回调机制
- 表达式求值
- 深入学习android之AlarmManager
- 权限管理模型分析
- axis2开发webservice之将Spring的装配JavaBean发布成WebService
- Android Service
- eclipse修改快捷键
- cxf 配置客户端
- static 和 存储区
- sqlserver2008错误sqlstate:42000 NativeError:1802解决办法 .