[openjudge 6263] 불 표현 식 (스 택)

불 표현 식 을 입력 하 는 것 을 설명 합 니 다. 진짜 값 을 출력 하 십시오.예 를 들 어 (V | V) & F & (F | V) V 는 true 를 나타 내 고 F 는 false 를 나타 내 며 & 표시 와 | 표시 또는!잘못 을 표시 하 다.위의 결 과 는 F 입 니 다.
입력 입력 은 여러 줄 을 포함 합 니 다. 줄 마다 불 표현 식 이 있 습 니 다. 표현 식 에 빈 칸 이 있 을 수 있 습 니 다. 총 길 이 는 1000 출력 을 초과 하지 않 고 줄 마다 입력 할 수 있 습 니 다. 표현 식 이 사실 이 라면 'V' 를 출력 합 니 다. 그렇지 않 으 면 'F' 샘플 입력 (V | V) & F & (F | V)!V | V & V & !F & (F | V) & (! F | F |! V & V) (F & F | V |! V &! F &! (F | F & V) 샘플 출력 F V V
표현 식 의 값 을 구 하 는 것 과 같이 '!'연산 하면 괄호 우선 순위 가 가장 높 고, 그 다음은 반 을 취한 다음 에 또는 합 과 이다.
#include
#include
#include
#include
#include// 
#include
using namespace std;
int r[7][7]={
        {' ','|','&','!','(',')','='},

        {'|','>','>',',','>','>'},

        {'&','>','>',',','>','>'},

        {'!','>','>','=',','>','>'},

        {'(',',',',','=',' '},

        {')','>','>','>',' ','>','>'},

        {'=',',',',',' ','='},
//    !!V          !         ! !  =     5 
};
stack<int>opd;//     
stack<char>opr;
char ss(char x,char y){
    switch(x){
        case '|':x=1;break;
        case '&':x=2;break;
        case '!':x=3;break;
        case '(':x=4;break;
        case ')':x=5;break;
        case '=':x=6;break;
    }
    switch(y){
        case '|':y=1;break;
        case '&':y=2;break;
        case '!':y=3;break;
        case '(':y=4;break;
        case ')':y=5;break;
        case '=':y=6;break;
    }
    return r[x][y];
}
char  s[1020];
char temp[1020];
void makeinput(char *temp){//              
    int p=0;
    int len=strlen(temp);
    for(int i=0;iif(temp[i]==' ') continue;
        s[p++]=temp[i];
    }
    s[p]='=';
    s[p+1]='\0';
}
nt ct1(int x,char ch,int y){
    switch(ch){
        case '|':return x|y;break;
        case '&':
            return x&y;break;
    }
}
int ct2(int x){
    return !x;
}
void deal(){
    while(!opr.empty())
        opr.pop();
    int t=0;
    opr.push('=');
    char ch;
    ch=s[t++];
    while(ch!='='||opr.top()!='='){
        if(ch=='V'||ch=='F'){
            if(ch=='V') opd.push(1),ch=s[t++];
            else if(ch=='F') opd.push(0),ch=s[t++];
        }
        else 
        switch(ss(opr.top(),ch)){
            case ':opr.push(ch);ch=s[t++];break;
            case '>':{
                char cch=opr.top();
                opr.pop();
                //     !        opd       
                else if(cch=='!'&&!(opd.empty())
                {
                    int x=opd.top();opd.pop();
                    opd.push(ct2(x));
                }
                else if(cch=='&'||cch=='|'){
                    int y=opd.top();opd.pop();
                    int x=opd.top();opd.pop();
                    opd.push(ct1(x,cch,y));
    //cout<
                }
                break;
            }
            case '=':
                opr.pop();
                ch=s[t++];
                break;
        }
    }
    int c=opd.top();
    opd.pop();
    if(c==1) cout<<"V"<else cout<<"F"<int main(){
    while(gets(temp)){
        makeinput(temp);
        deal();
    }
    return 0;
}

좋은 웹페이지 즐겨찾기