Problem Description
小明在你的帮助下,破译了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”、“)”、“0-9”、“+”、“-”、“*”、“/”、“^”,求出的值就是密码。小明的数学学得不好,还需你帮他的忙。(“/”用整数除法)
Input
输入的第一行为T,表示测试示例的个数,每组数据只有一行是一个算式(算式长度<=30)。
Output
对于每组数据,输出算式的值(所有数据在2^31-1内)。
Sample Input
1 1+(3+2)*(7^2+6*9)/(2)
Sample Output
258
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int p,i,number[40]; char s[40],symbol[40]; int POW(int a,int b) //求a^b { int j,t=1; for(j=1;j<=b;j++) t*=a; return t; } bool can() //判断前者运算符与当前运算符的优先级 { if((s[i]=='+'||s[i]=='-')&&symbol[p]!='(') return 1; if((s[i]=='*'||s[i]=='/')&&(symbol[p]=='*'||symbol[p]=='/'||symbol[p]=='^')) return 1; if(s[i]=='^'&&symbol[p]=='^') return 1; return 0; } void POP() { switch(symbol[p--]) { case'+':number[p]+=number[p+1]; break; case'-':number[p]-=number[p+1]; break; case'*':number[p]*=number[p+1]; break; case'/':number[p]/=number[p+1]; break; case'^':number[p]=POW(number[p],number[p+1]); break; } } #define MAX(a,b) ((a)>(b) ? (a):(b)) #define MIN(a,b) ((a)<(b) ? (a):(b)) int main() { int t; scanf("%d\n",&t); while(t--) { int x,len; p=1; i=0; gets(s); len=strlen(s); s[len]=')'; symbol[p]='('; while(i<len) { while(s[i]=='(') { symbol[++p]=s[i]; i++; } x=0; while(s[i]>='0'&&s[i]<='9') { x=x*10+s[i++]-'0'; } number[p]=x; do { if(s[i]==')') { while(symbol[p]!='(') POP(); number[--p]=number[p+1]; } else { while(can()) POP(); symbol[++p]=s[i]; } i++; }while(i<=len&&s[i-1]==')'); } printf("%d\n",number[0]); } return 0; }