POJ 2106 Boolean Expressions (栈,位运算)
2013-11-13 18:28
375 查看
跟四则混合运算一个算法
建两个栈,一个保存操作符,一个保存操作数
根据操作符的优先级给操作符编号,最低优先级的数字最大(也可以反过来,随便玩),然后当操作符入栈的时候,如果栈顶数字比他大,则执行栈顶操作符直到栈为空或栈顶小于等于入栈操作符。
最后别忘了完结的时候执行完栈内操作符。
建两个栈,一个保存操作符,一个保存操作数
根据操作符的优先级给操作符编号,最低优先级的数字最大(也可以反过来,随便玩),然后当操作符入栈的时候,如果栈顶数字比他大,则执行栈顶操作符直到栈为空或栈顶小于等于入栈操作符。
最后别忘了完结的时候执行完栈内操作符。
#include <stdio.h> void execute(char mode,char *stack,int *pointer) { switch(mode) { case 3: stack[*pointer-1]^=1;break; case 2: stack[*pointer-2]=stack[*pointer-1]&stack[*pointer-2];--*pointer;break; case 1: stack[*pointer-2]=stack[*pointer-1]|stack[*pointer-2];--*pointer;break; } } int main() { char tmp[101],stack1[101],stack2[101]; int i=0,s1=0,s2=0,count=1; while(NULL != gets(tmp)) { i=0,s1=0,s2=0; while(' '==tmp[i]) { ++i; } while(0 != tmp[i]) { switch(tmp[i]) { case 'V': stack2[s2++]=1;break; case 'F': stack2[s2++]=0;break; case ')': while(stack1[--s1]!=0) { execute(stack1[s1],stack2,&s2); }break; case '!': stack1[s1++]=3;break; case '&': while(stack1[s1-1]>2) { execute(stack1[--s1],stack2,&s2); } stack1[s1++]=2;break; case '|': while(stack1[s1-1]>1) { execute(stack1[--s1],stack2,&s2); } stack1[s1++]=1;break; case '(': stack1[s1++]=0; } ++i; while(0 != tmp[i] && ' '==tmp[i]) { ++i; } } while(0 != s1) { execute(stack1[--s1],stack2,&s2); } printf("Expression %d: %c\n",count++,0 == stack2[0]?'F':'V'); } }
相关文章推荐
- openwrt启动脚本分析
- Linux线程编程
- 南阳理工OJ_公约数和公倍数
- Spring整合Hibernate的步骤
- 敏捷开发
- Nginx Http认证 实现访问网站或目录密码认证保护
- Restore IP Addresses
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
- 诡异的_GNU_SOURCE宏
- mysql学习入门
- 在MyEclipse中配置Tomcat服务器
- ComboBox验证例子
- A标签的target属性的使用
- 技术知识贴模板
- jquery菜单下 4000 拉特效 非常简单
- FTP中的ftpsvc
- asp.net mvc 分页
- ubuntu上修改mysql默认字符编码出现的Job failed to start解决方法
- 网页出现二进制截断
- HD-SDI DVR发展与应用剖析