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;
}