表达式
表达式
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2549
算术表达式的求值我们在小学的时候就已经熟练掌握了。给出若干个只含加减乘的表达式你的任务是计算出结果。为了简化计算,给定的表达式的运算符只包含 ‘+’、‘-’、‘*’。运算符优先级为‘*’ > ‘+’ = ‘-’。
输入
输入数据的第一行为一个正整数 T (T <= 100),表示有 T 组测试数据。
对于每组测试数据,输入一行表达式,由数字、运算符组成,且数字和运算符之间没有空格。数字均为整数, 运算符为 ‘+’,‘ –’,‘*’ 中的一个,表达式字符串长度<=100。
数字保证没有前导0,任意两个数字之间有且仅有一个运算符(不会出现3--2 等情况),运算中间结果及最终结果保证在int范围内。
对于每组测试数据,输入一行表达式,由数字、运算符组成,且数字和运算符之间没有空格。数字均为整数, 运算符为 ‘+’,‘ –’,‘*’ 中的一个,表达式字符串长度<=100。
数字保证没有前导0,任意两个数字之间有且仅有一个运算符(不会出现3--2 等情况),运算中间结果及最终结果保证在int范围内。
输出
对于每组测试数据,输出表达式的结果。
示例输入
1 1-2*3
示例输出
-5
测试数据全都正确,但是提交上总是wrong answer,个人认为应该是整数的问题,在本代码中,整数的取值范围是0~9,一旦超出,就会出错;
思路就是先转换成后缀式,再由后缀式求值。
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 char zhan[300]; 5 int top=-1; 6 void ruzhan(char ch) 7 { 8 zhan[++top]=ch; 9 } 10 int cmp(char ch) 11 { 12 if(ch=='+'||ch=='-')return 1; 13 if(ch=='*'||ch=='/')return 2; 14 if(ch=='(')return 3; 15 } 16 int main() 17 { 18 int zong ; 19 //while(scanf("%d",&zong)!=EOF) 20 scanf("%d",&zong ); 21 { 22 while(zong--) 23 { 24 top=-1; 25 char g[300]; 26 int t=-1; 27 char f[300]; 28 scanf("%s",f); 29 int len=strlen(f); 30 int i; 31 for(i=0; i<=len-1; i++) 32 { 33 if((f[i]>='0'&&f[i]<='9')||(f[i]>='a'&&f[i]<='z')) 34 g[++t]=f[i]; 35 else//如果是运算符的话 36 { 37 if(f[i]=='(')ruzhan(f[i]);//运算符是左括号 38 else if(f[i]==')')//运算符是右括号 39 { 40 for(; zhan[top]!='('; top--) 41 { 42 g[++t]=zhan[top]; 43 } 44 --top; 45 } 46 else//运算符是加减乘除运算符中的一种运算符 47 { 48 if(cmp(f[i])>cmp(zhan[top]))//当前运算符优先级大于栈顶运算符的优先级 49 ruzhan(f[i]); 50 else//当前运算符优先级小于等于栈顶运算符优先级 51 { 52 if(zhan[top]=='(')ruzhan(f[i]);//栈顶运算符是左括号的特殊情况 53 else//栈顶运算符是加减乘除四种运算符的一种 54 { 55 while(cmp(f[i])<=cmp(zhan[top]))//当前运算符优先级小于等于栈顶运算符优先级的时候执行循环体 56 { 57 g[++t]=zhan[top]; 58 top--; 59 } 60 ruzhan(f[i]); 61 } 62 } 63 } 64 } 65 } 66 for(; top>=0; top--) 67 g[++t]=zhan[top]; 68 /*//验证输出后缀式 69 for(i=0;i<=t;i++) 70 printf("%c",g[i]); 71 printf("\n"); 72 */ 73 int h[300]; 74 top=-1; 75 int sum; 76 for(i=0; i<=t; i++) 77 { 78 if(g[i]>='0'&&g[i]<='9') 79 { 80 h[++top]=g[i]-'0'; 81 } 82 else 83 { 84 switch(g[i]) 85 { 86 case '+': 87 sum=h[top-1]+h[top]; 88 break; 89 case '-': 90 sum=h[top-1]-h[top]; 91 break; 92 case '*': 93 sum=h[top-1]*h[top]; 94 break; 95 case '/': 96 sum=h[top-1]/h[top]; 97 break; 98 } 99 top=top-2; 100 h[++top]=sum; 101 } 102 } 103 printf("%d\n",h[0]); 104 } 105 } 106 return 0; 107 }
9月27号:
正确的代码是:
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 struct vode 5 { 6 int date; 7 int flag1; 8 char ch; 9 int flag2; 10 }; 11 int cmp(char ch) 12 { 13 if(ch=='+'||ch=='-')return 1; 14 if(ch=='*'||ch=='/')return 2; 15 if(ch=='(')return 3; 16 } 17 int zhuanhuan(int n) 18 { 19 int i,sum=1; 20 for(i=0;i<=n-1;i++) 21 sum*=10; 22 return sum; 23 } 24 int zhuanzhi(char f[],int t) 25 { 26 int i,s=t; 27 int sum=0; 28 for(;t>=0;t--) 29 { 30 sum+=zhuanhuan(s-t)*(f[t]-'0'); 31 } 32 return sum; 33 } 34 void hanshu(struct vode f[],int n); 35 int main() 36 { 37 int zong ; 38 cin>>zong ; 39 while(zong--) 40 { 41 char f[106]; 42 char zhan[106]; 43 int top=-1; 44 struct vode bds[106]; 45 memset(bds,0,sizeof(bds)); 46 int t=-1; 47 cin>>f; 48 int lenth=strlen(f); 49 int i,j; 50 for(i=0;i<=lenth-1;i++) 51 { 52 int sum=0; 53 if(f[i]>='0'&&f[i]<='9') 54 { 55 char zs[105]; 56 int st=-1; 57 i--; 58 int j=i; 59 do 60 { 61 i++; 62 j++; 63 zs[++st]=f[j]; 64 } 65 while(f[j+1]>='0'&&f[j+1]<='9'); 66 bds[++t].date=zhuanzhi(zs,st); 67 bds[t].flag1=1; 68 } 69 else 70 { 71 if(f[i]=='(') 72 { 73 zhan[++top]='('; 74 } 75 else if(f[i]==')') 76 { 77 for(;zhan[top]!='(';top--) 78 { 79 bds[++t].ch=zhan[top]; 80 bds[t].flag2=1; 81 } 82 top--; 83 } 84 else 85 { 86 if(cmp(zhan[top])<cmp(f[i])) 87 { 88 zhan[++top]=f[i]; 89 } 90 else 91 { 92 while(cmp(zhan[top])>=cmp(f[i])&&zhan[top]!='(') 93 { 94 bds[++t].ch=zhan[top]; 95 bds[t].flag2=1; 96 top--; 97 } 98 zhan[++top]=f[i]; 99 } 100 } 101 } 102 } 103 for(;top>=0;top--) 104 { 105 bds[++t].ch=zhan[top]; 106 bds[t].flag2=1; 107 } 108 //验证输出 109 /*for(i=0;i<=t;i++) 110 { 111 if(bds[i].flag1)cout<<bds[i].date; 112 if(bds[i].flag2)cout<<bds[i].ch; 113 } 114 cout<<endl;*/ 115 hanshu(bds,t); 116 } 117 return 0; 118 } 119 void hanshu(struct vode bds[],int s) 120 { 121 int i,t=-1; 122 int zhan[1008]; 123 for(i=0;i<=s;i++) 124 { 125 if(bds[i].flag1) 126 zhan[++t]=bds[i].date; 127 else 128 { 129 switch(bds[i].ch) 130 { 131 case '+': 132 zhan[t-1]=zhan[t-1]+zhan[t];break; 133 case '-': 134 zhan[t-1]=zhan[t-1]-zhan[t];break; 135 case '*': 136 zhan[t-1]=zhan[t-1]*zhan[t];break; 137 case '/': 138 zhan[t-1]=zhan[t-1]/zhan[t];break; 139 } 140 t--; 141 } 142 } 143 cout<<zhan[0]<<endl; 144 }
线性表代码:runtime error
1 //线性表代码:re了 2 #include<iostream> 3 #include<string.h> 4 #include<stdlib.h> 5 using namespace std; 6 const int maxx=1000; 7 struct vode 8 { 9 int date; 10 int flag1; 11 char ch; 12 int flag2; 13 }; 14 typedef struct 15 { 16 struct vode *elem; 17 int top; 18 int stacksize; 19 } hzsz; 20 typedef struct 21 { 22 char *elem; 23 int top; 24 int stacksize; 25 } ysfz; 26 typedef struct 27 { 28 char *f; 29 int length; 30 int stacksize; 31 } inz; 32 int cmp(char ch); 33 void inite(hzsz &l1,ysfz &l2,inz &l3); 34 int zhuanhuan(int n); 35 int zhuanzhi(char f[],int t); 36 void hzbds(inz &in,hzsz &hzs,ysfz &ysf); 37 void qiuzhi(hzsz &hzs); 38 int main() 39 { 40 int zong ; 41 cin>>zong ; 42 while(zong--) 43 { 44 hzsz hzs; 45 ysfz ysf; 46 inz in; 47 inite(hzs,ysf,in); 48 cin>>in.f; 49 hzbds(in,hzs,ysf); 50 } 51 return 0; 52 } 53 int cmp(char ch) 54 { 55 if(ch=='+'||ch=='-')return 1; 56 else if(ch=='*'||ch=='/')return 2; 57 else if(ch=='(')return 3; 58 } 59 void inite(hzsz &l1,ysfz &l2,inz &l3) 60 { 61 l1.elem=(struct vode *)malloc(maxx*sizeof(struct vode)); 62 //memset(l1.elem,0,sizeof(l1.elem)); 63 int i; 64 for(i=0;i<=999;i++) 65 { 66 l1.elem[i].flag1=0; 67 l1.elem[i].flag2=0; 68 } 69 l1.stacksize=maxx; 70 l1.top=-1; 71 l2.elem=(char *)malloc(maxx*sizeof(char)); 72 l2.stacksize=maxx; 73 l2.top=-1; 74 l3.f=(char *)malloc(maxx*sizeof(char)); 75 l3.stacksize=maxx; 76 } 77 int zhuanhuan(int n) 78 { 79 int i,sum=1; 80 for(i=0; i<=n-1; i++) 81 sum*=10; 82 return sum; 83 } 84 int zhuanzhi(char f[],int t) 85 { 86 int s=t; 87 int sum=0; 88 for(; t>=0; t--) 89 { 90 sum+=zhuanhuan(s-t)*(f[t]-'0'); 91 } 92 return sum; 93 } 94 void hzbds(inz &in,hzsz &hzs,ysfz &ysf) 95 { 96 in.length=strlen(in.f); 97 int i; 98 for(i=0; i<=in.length-1; i++) 99 { 100 if(in.f[i]>='0'&&in.f[i]<='9') 101 { 102 char zs[106]; 103 int st=-1; 104 i--; 105 do 106 { 107 i++; 108 zs[++st]=in.f[i]; 109 } 110 while(in.f[i+1]>='0'&&in.f[i+1]<='9'); 111 hzs.elem[++hzs.top].date=zhuanzhi(zs,st); 112 hzs.elem[hzs.top].flag1=1; 113 } 114 else 115 { 116 if(in.f[i]=='(') 117 { 118 ysf.elem[++ysf.top]=in.f[i]; 119 } 120 else if(in.f[i]==')') 121 { 122 for(; ysf.elem[ysf.top]!='('; ysf.top--) 123 { 124 hzs.elem[++hzs.top].ch=ysf.elem[ysf.top]; 125 hzs.elem[hzs.top].flag2=1; 126 } 127 ysf.top--; 128 } 129 else 130 { 131 if(ysf.top==-1) 132 { 133 ysf.elem[++ysf.top]=in.f[i]; 134 } 135 else if(cmp(ysf.elem[ysf.top])<cmp(in.f[i])) 136 { 137 ysf.elem[++ysf.top]=in.f[i]; 138 } 139 else 140 { 141 while(cmp(ysf.elem[ysf.top])>=cmp(in.f[i])&&ysf.elem[ysf.top]!='('&&ysf.elem[i]!=-1) 142 { 143 hzs.elem[++hzs.top].ch=ysf.elem[ysf.top]; 144 hzs.elem[hzs.top].flag2=1; 145 ysf.top--; 146 } 147 ysf.elem[++ysf.top]=in.f[i]; 148 } 149 } 150 } 151 } 152 for(; ysf.top>=0; ysf.top--) 153 { 154 hzs.elem[++hzs.top].ch=ysf.elem[ysf.top]; 155 hzs.elem[hzs.top].flag2=1; 156 } 157 /*验证输出 158 for(i=0; i<=t; i++) 159 { 160 if(hzs.elem[i].flag1==1)cout<<hzs.elem[i].date<<" "; 161 if(hzs.elem[i].flag2==1)cout<<hzs.elem[i].ch<<" "; 162 //else cout<<hzs.elem[i].ch; 163 // cout<<hzs.elem[i].flag1<<hzs.elem[i].date<<endl; 164 //cout<<hzs.elem[i].flag2<<hzs.elem[i].ch<<endl<<endl; 165 } 166 cout<<endl;*/ 167 qiuzhi(hzs); 168 } 169 void qiuzhi(hzsz &hzs) 170 { 171 double number[106]; 172 int st=-1,i; 173 for(i=0;i<=hzs.top;i++) 174 { 175 if(hzs.elem[i].flag1==1) 176 { 177 number[++st]=hzs.elem[i].date; 178 } 179 else 180 { 181 switch (hzs.elem[i].ch) 182 { 183 case '+':number[st-1]=number[st-1]+number[st];break; 184 case '-':number[st-1]=number[st-1]-number[st];break; 185 case '*':number[st-1]=number[st-1]*number[st];break; 186 case '/':number[st-1]=number[st-1]/number[st];break; 187 } 188 st--; 189 } 190 } 191 cout<<number[0]<<endl; 192 }