1.26(括号匹配,计算问题)


1.括号匹配只记录一道题,要求括号包含顺序正确{【(《形式

#include
using 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)