1.26(括号匹配,计算问题)
1.括号匹配只记录一道题,要求括号包含顺序正确{【(《形式
#includeusing namespace std; int main(){ int top[4] = {0}; //{ [ ( < int f = 1,n; string s; cin>>n; for(int j = 1;j <= n;j++){ memset(top,0,sizeof(top)); f = 1; cin>>s; for(int i = 0;i < s.size();i++){ if(s[i]=='<'){ top[3]++;continue; } if(s[i]=='('){ if(top[3]){ printf("NO\n");f = 0;break; } top[2]++;continue; } if(s[i]=='['){ if(top[3]||top[2]){ printf("NO\n");f = 0;break; } top[1]++;continue; } if(s[i]=='{'){ if(top[3]||top[2]||top[1]){ printf("NO\n");f = 0;break; } top[0]++;continue; } if(s[i]=='>'){ if(!top[3]){ printf("NO\n");f = 0;break; } top[3]--;continue; } if(s[i]==')'){ if(!top[2]||top[3]){ printf("NO\n");f = 0;break; } top[2]--;continue; } if(s[i]==']'){ if(!top[1]||top[2]||top[3]){ printf("NO\n");f = 0;break; } top[1]--;continue; } if(s[i]=='}'){ if(!top[0]||top[1]||top[2]||top[3]){ printf("NO\n");f = 0;break; } top[0]--;continue; } } if(f == 0) continue; for(int k = 0;k < 4;k++){ if(top[k]){ printf("NO\n"); f = 0; } } if(f) printf("YES\n"); } return 0; }
2.计算
关于把输入表达式计算出结果。。。
#include#define go for(int i = start;i <= end;i++) using namespace std; const int O = -10000; string s; int shu[30] = {}; //用于记录所有的数和运算符位置,运算符位置为-1 int fu[30] = {},l; int res[30] = {};//用于记录结果 /*void out(){ for(int i = 0;i < l;i++){ cout< */ void swi(){ for(int i = 0;i <= l;i++){ switch(s[i]){ case'(':shu[i] = O;fu[i] = 6;break; case')':shu[i] = O;fu[i] = 7;break; case'+':shu[i] = O;fu[i] = 1;break; case'-':shu[i] = O;fu[i] = 2;break; case'*':shu[i] = O;fu[i] = 3;break; case'/':shu[i] = O;fu[i] = 4;break; case'^':shu[i] = O;fu[i] = 5;break; default: int x = s[i]-'0';while(s[i+1]>='0'&&s[i+1]<='9'){shu[i]=O;i++;;x = x*10 + s[i]-'0';}shu[i]=x; } } return; } /*void prt(int i){ printf("[%d %d]\n",i,res[i]); }*/ void clear(int x,int y){ for(int i = x;i <= y;i++){ shu[i] = O; fu[i] = 0; } } int calc(int start,int end){ //printf("start:%d-->end:%d\n",start,end); //out(); int sign,f = 0; if(fu[start] == 2){ start += 1; shu[start]*=-1; } //先遍历,遇括号算括号 go{ if(fu[i]==6){ f = 1; sign = end; while(fu[sign]!=7) sign--; res[sign] = calc(i+1,sign-1); clear(i,sign); shu[sign] = res[sign]; //prt(sign);out(); } } //再遍历,遇乘方算乘方 go{ if(fu[i]==5){ f=1; sign = i; while(shu[sign]==O) sign++; res[sign] = pow(shu[i-1],shu[sign]); clear(i-1,sign); shu[sign]=res[sign]; //prt(sign);out(); } } //再遍历,遇乘除算乘除 go{ if(fu[i]==3){ f=1; sign = i; while(shu[sign]==O) sign++; res[sign] = shu[i-1]*shu[sign]; clear(i-1,sign); shu[sign]=res[sign]; //prt(sign);out(); continue; } if(fu[i]==4){ f=1; sign = i; while(shu[sign]==O) sign++; res[sign] = shu[i-1]/shu[sign]; clear(i-1,sign); shu[sign]=res[sign]; //prt(sign);out(); } } //最后遍历,算加减 go{ if(fu[i]==1){ f=1; sign = i; while(shu[sign]==O) sign++; res[sign] = shu[sign]+shu[i-1]; clear(i-1,sign); shu[sign]=res[sign]; //prt(sign);out(); continue; } if(fu[i]==2&&i!=start){ f=1; sign = i; while(shu[sign]==O) sign++; res[sign] = shu[i-1]-shu[sign]; clear(i-1,sign); shu[sign]=res[sign]; //prt(sign);out(); } } //如果一直没有计算(f=0)则输出第一个数 if(f==0){ return shu[start]; } return res[sign]; } int main(){ cin>>s; l = s.size(); swi(); printf("%d",calc(0,l)); } //5-(2*(3-5)-1)