题意:关于!,&,| 的运算,表达式中V代表true,F代表false。

思路:见代码吧,很详细了。

  要注意 !!!F,!(...) 的情况。

#include <iostream>
#include <stdio.h>
#include <stack>
#include <string.h>
#include <map> using namespace std;
const int maxn=;
stack<int> val; //存储操作数和中间运算结果
stack<char> op; //存储运算符
map<char,int> maps; //存储相应运算符的优先级,数值大代表优先级高 //求!a
void opNot(int a){
while(!op.empty() && op.top()=='!') {
op.pop();
a=!a;
}
val.push(a);
}
int main() {
char ch;
int a,b,t=;
maps['!']=;maps['&']=;maps['|']=;
while((ch=getchar())!=EOF) {
t++;
while(!val.empty())
val.pop();
while(!op.empty())
op.pop();
do {
if(ch==' ')
continue;
/*
遇到V\F,查看之前的表达式中(即栈op中)是否存在优先级高的单目运算符!。
若存在,将这些单目运算符出op栈,对操作数进行相应的运算,再将运算结果压入val栈
*/
if(ch=='V') {
a=;
opNot(a);
} else if(ch=='F') {
a=;
opNot(a);
}
//若遇到(,直接入op栈
else if(ch=='(') {
op.push('(');
}
/*
当遇到'(',将op中的运算符出栈,并将val栈中退出两个操作数,求值后将结果如val栈
直至遇到'('结束。这里不需要考虑运算符为!的情况,因为之前肯定已经处理过了。 这里还要注意的是,很有可能在'('前有!运算符,所以再求出(...)内的值后,不能就以为ok了。
还要判断op栈顶上是否存在'!',若存在,还要对结果取!。
*/
else if(ch==')') {
//一开始忽略了有!(...)情况,导致一直WA。。。
while(op.top()!='(') {
a=val.top();
val.pop();
b=val.top();
val.pop();
if(op.top()=='|')
val.push(a|b);
else
val.push(a&b); op.pop();
}
op.pop(); //将'('出栈
//若(...)前有!,则将括号算出来的结果取!
while(!op.empty() && op.top()=='!'){
op.pop();
a=val.top();
val.pop();
val.push(!a);
}
} else {
/*
若ch为'!',则不执行while循环,直接入op栈。
若ch是其它双目运算符,则计算op栈顶中优先级比ch高的双目运算符。
每弹出其中一个,从val栈顶退出两个操作数a,b,求结果后入val栈。
进行完所有op栈顶中优先级比ch高的双目运算符后,再将ch压入op栈
*/
while(!op.empty() && op.top()!='(' && op.top()!='!' && maps[op.top()]>=maps[ch]) {
a=val.top();
val.pop();
b=val.top();
val.pop();
if(op.top()=='|')
val.push(a|b);
else
val.push(a&b);
op.pop();
}
op.push(ch); //一开始都忘记把ch入栈了。。。
}
} while((ch=getchar())!='\n' && ch!=EOF);
/*
扫描完所有表达式后,若op栈中还有运算符,则继续计算。
本来此处还考虑了万一有'!'运算符的情况,后来把这部分代码删了,提交后仍AC,
想了想,确实如果有'!',也早就在之前就已经处理了。
*/
while(!op.empty()) {
ch=op.top();
op.pop();
a=val.top();
val.pop();
b=val.top();
val.pop();
if(ch=='|')
val.push(a|b);
else
val.push(a&b);
}
if(val.top()==)
ch='V';
else
ch='F';
printf("Expression %d: %c\n",t,ch);
} return ;
}

POJ 2106 Boolean Expressions (布尔表达式求值)的更多相关文章

  1. (栈的应用5.2.2)POJ 2106 Boolean Expressions(表达式求值)

    /* * POJ_2106.cpp * * Created on: 2013年10月30日 * Author: Administrator */ #include <iostream> # ...

  2. [poj 2106] Boolean Expressions 递归

    Description The objective of the program you are going to produce is to evaluate boolean expressions ...

  3. POJ 2106 Boolean Expressions

    总时间限制: 1000ms  内存限制: 65536kB 描述 The objective of the program you are going to produce is to evaluate ...

  4. poj 2106 Boolean Expressions 课本代码

    #include<cstdio> const int maxn=100 +10; int val[maxn],vtop; int op[maxn],otop; void insert(in ...

  5. Boolean Expressions POJ - 2106 (表达式求值)

    The objective of the program you are going to produce is to evaluate boolean expressions as the one ...

  6. POJ 2106-Boolean Expressions,双栈运用类似表达式求值!

    Boolean Expressions 首先声明此题后台可能极水(毕竟这种数据不好造!).昨天写了一天却总是找不到bug,讨论区各种数据都过了,甚至怀疑输入有问题,但看到gets也可以过,难道是思路错 ...

  7. 在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式

    在进行项目开发的时候,刚好需要用到对字符串表达式进行求值的处理场景,因此寻找了几个符合要求的第三方组件LambdaParser.DynamicExpresso.Z.Expressions,它们各自功能 ...

  8. POJ | Boolean Expressions

    总时间限制: 1000ms  内存限制: 65536kB 描述The objective of the program you are going to produce is to evaluate ...

  9. 利用Z.Expressions.Eval表达式求值

    Z.Expression.Eval是一个开源的(OpenSource),可扩展的(Extensible),超轻量级(Super lightweight)的公式化语言解析执行工具包. 使用方法:1.从n ...

随机推荐

  1. const char *p、char const *p、char * const p的区别?

    const char *p和char const *p是一样的,都表示定义一个指向字符常量的指针,指针的内容(字符)不可变.char * const p表示一个指向字符的指针常量,字符可以改变,但是指 ...

  2. insertorupdate

    MERGE INTO  运用的心得 最近完成一个功能,就是往表里插入数据,以party_id 和prod_id为联合主键,存在的更新,不存在的插入, ORACLE 10g 后可以试用MERGE INT ...

  3. 第一个APP 时钟

    //  ViewController.h //  IOS310803 // //  Created by 张艳锋 on 15/8/3. //  Copyright (c) 2015年 zyf. All ...

  4. vim包,已自带所有常用插件及常用命令总结

    /** ****************************************************************************** * @author    Maox ...

  5. Flex-box 学习

    .flex-cont{ /*定义为flexbox的“父元素”*/ display: -webkit-box; display: -webkit-flex; display: flex; /*子元素沿主 ...

  6. struct和class区别

    转载来源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据 ...

  7. IOS_设置启动图片若干问题

    在做项目时, 发现设置了LaunchImage时发现一些问题: 1. 启动图片的设置可以通过两种方法: 1) 通过在LaunchScreen里放入ImageView 并设置图片, 这种方法的好处在于不 ...

  8. hibernate数据库配置

    在文件夹etc中 ## MySQL #hibernate.dialect org.hibernate.dialect.MySQLDialect #hibernate.dialect org.hiber ...

  9. Django Form的学习

    django.forms 是Django处理form的库      本质上可以直接通过对HttpRequest达到同样的效果,但是django.from带来更便捷的处理方式.功能有几点 通过form类 ...

  10. 使用Powershell在Microsoft Azure中创建Virtual Machine

    获取虚拟机镜像 PS C:\WINDOWS\system32> Get-AzureVMImage 仅获得虚拟机名 PS C:\WINDOWS\system32> (Get-AzureVMI ...