(一)boolean
- 【题目描述】:
输入一个布尔表达式,请你输出它的真假值。
比如:( V | V ) & F & ( F | V )
V 表示 true,F 表示 false,& 表示与,| 表示或,! 表示非。
上式的结果是 F
注:! 的优先级最高,& 次之,| 最低 - 【Sample Input】
!V | V & V & !F & (F | V ) & (!F | F | !V & V) - 【Sample Output】
- 【注】对于 60% 的数据,表达式总长度 ≤ 10^3;对于 100% 的数据,表达式总长度 ≤ 10^6
【题解】看到这题反应就是表达式求值,妥妥20分钟打个栈过了。听说许多god被多个连续!给坑了,我的做法想想不会出事。。。当然表达式求值用栈或者分治都是妥妥过的。
//开两个栈一个记值一个记符号,符号取优先级判断
#include <cstdio>
#include <cstring>
int l,t,top,z[1000005],c[1000005];
char s[1000005];
int main()
{
for (char ch;~scanf("%c",&ch);)
if (ch=='(' || ch=='!' || ch=='&' || ch=='|' || ch==')'
|| ch=='V' || ch=='F') s[++l]=ch;
s[0]='(';s[l+1]=')';l+=2;
for (int i=0;i<l;++i)
{
if (s[i]=='V' || s[i]=='F') z[++t]=(s[i]=='V');
else
{
int k=0;
if (s[i]=='(') k=0;
if (s[i]=='!') k=1;
if (s[i]==