6263:布尔表达式:输入一个布尔表达式,请你输出它的真假值
样例输入:
( V | V ) & F & ( F| V)
!V | V & V & !F & (F | V ) & (!F | F | !V & V)
(F&F|V|!V&!F&!(F|F&V))
思路:本题的关键就是定义优先级,表中含义是后来的符号是小于、等于、或者大于先前的符号。其中若符号相同先入的普遍大于后入的。对于“(”和“)”必须仔细考虑。如栈有"("则之后的符号都大,必须压入栈。目前读到“(”则此时它比任何符号都要小,直接入栈。目前读到“)”它优先级最大,必须把能计算的计算完,直到遇到“=”。可以这么考虑:即目前读入的需要压入栈的则优先级小。在栈中要一直保持优先级高的在上面。其中“0”代表非法的比较,或者说表达式中不存在这种情况。
先\后 | & ! ( ) #
| > < < < > >
& > > < < > >
! > > = < > >
( < < < < = 0
) > > > 0 > >
# < < < < 0 =
注意:
1、此题的两个“!”之间是=的优先级,即相互抵消
2、注意若出现>则需要循环计算到!=>为止
3、bool型不能用~取反,只能用1-n[ntop-1]
#include<cstdio>
#include<iostream>
#include<string>
#include<map>
using namespace std;
map<char,int>index;//| & ! ( ) #
char pri[7][7]={ {'>','<','<','<','>','>'},//|
{'>','>','<','<','>','>'},//&
{'>','>','=','<','>','>'},//!
{'<','<','<','<','=','0'},//(
{'>','>','>','0','&