noi.openjudge 6263:布尔表达式

http://noi.openjudge.cn/ch0303/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

代码

/*
优先级表
a<b表示a的优先级小于等于b
a>b表示a的优先级大于b
=表示遇到了右括号
-表示不可能出现的比较
*/
#include<iostream>
#include<stack> 
using namespace std;

char table[5][5]=
{
    /* !    &    |    (    )  */
    { '>', '<', '<', '>', '<' },
    { '>', '<', '<', '>', '<' },
    { '>', '<', '<', '>', '<' },
    { '>', '>', '>', '>', '=' },
    { '>', '>', '>', '-', '<' }
};

char precede(char a, char b)// 优先级  
{
    int i, j;
    switch (a)
    {
	    case '!': i=0;break;
	    case '&': i=1;break;
	    case '|': i=2;break;
	    case '(': i=3;break;
	    case ')': i=4;break;
    }
    
    switch (b)
    {
	    case '!': j=0;break;
	    case '&': j=1;break;
	    case '|': j=2;break;
	    case '(': j=3;break;
	    case ')': j=4;break;
    }
    return table[i][j];
}

bool boolIt(char a)// V表示true  F表示false  
{
    if(a=='V')return true;
    if(a=='F')return false;
}

char cal(char c,char a,char b='V')// !非 &与 |或 运算结果  
{
    bool num1=boolIt(a);
    bool num2=boolIt(b);
    bool result;
    
    switch(c)// 按要求判断  
    {
	    case '|': result=num1|num2; break;
	    case '&': result=num1&num2; break;
	    case '!': result=!num1;		break;
    }
    
    if(result)
		return 'V';
    else
		return 'F';
}

void goCal(stack<char> &mystack, stack<char> &data)//将 !非 &与 |或 运算结果 压栈  
{
    char mystack_cal=mystack.top();
    mystack.pop();

    if(mystack_cal=='!')
    {
        char num1=data.top();data.pop();
        char result=cal(mystack_cal, num1);data.push(result);
    }
    else
    {
        char num1=data.top();data.pop();
        char num2=data.top();data.pop();
        char result=cal(mystack_cal,num1,num2);data.push(result);
    }
}

void operateCh(char ch,int &i,stack<char> &mystack,stack<char> &data)// 根据优先级的不同做不同的处理  
{
    char pre=precede(mystack.top(),ch);
    if(pre=='>')
    {
        mystack.push(ch);
        i++;
        return;
    }
    else if(pre=='=')
    {
        mystack.pop();
        i++;
    }
    else if(pre=='<')
        goCal(mystack, data);
}

void showResult(string command)
{
    stack <char> mystack;
    stack <char> data;
    for(int i=0; i<command.size(); )
    {
        char ch=command[i];
        if(ch==' ')
        {
            i++;
            continue;
        }
        
        if(ch=='|' || ch=='&' || ch=='!' || ch=='(' || ch==')')// 为操作符  
            if(mystack.empty())// mystack为空  
            {
                mystack.push(ch);
                i++;
            }
            else
                operateCh(ch,i,mystack,data);
        else if(ch=='V' || ch=='F')// true false压入栈中  
        {
            data.push(ch);
            i++;
        }
    }
    while(!mystack.empty())// 不为空就不停的做运算  
        goCal(mystack,data);
    cout<<data.top()<<endl;
}

int main()
{
    string command;
    while(getline(cin,command))
        showResult(command);

    return 0;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值