[Swust OJ 322]--东6宿舍灵异事件(中缀表达式转化为后缀表达式的简单运用)
2015-06-16 19:04
351 查看
题目链接:http://acm.swust.edu.cn/problem/322/
Time limit(ms): 1000 Memory limit(kb): 65535
Description
将军听说最近东6闹鬼了,作为一个无神论者,将军当然不相信。但是这个传言已经泛滥了,许多人都在说这个事情,将军从每个人那里听到一个传言,将军可以容易的就知道这个传言是真还是假,但是当一大堆消息组合起来,将军就不知道了,所以将军就找到了你。
提供两种组合方式:
A&B:代表A和B都为真的时候,A和B组合起来为真,否则为假
A|B:代表A和B里面至少有1个为真的时候,A和B组合起来为真,否则为假
优先级顺序 “括号”>“&”>“|”
例如:a&b|(a|b&c),a=真,b=假,c=真;
那么上式可以这样转化
真&假 | (真|假&真)
假 | (真|假)
假 | 真
真
Input
有多组测试数据,每组测试数据共两行,第一行是一个逻辑范式,数据不用判错;
接下来三个字符,以空格隔开,分表代表a,b,c的真假(T/F);
Output
对于每一组数据,输出最终的结果(TRUE or FALSE);
Sample Input
Sample Output
SCPC - ChenYi
解题思路:更具a,b,c是否为真将其转换为1,0,再把中缀表达式转化为后缀表达式 ’|‘ 运算看做'+',把’&‘运算看做'*',然后看最后的结果就是~~~
代码如下:
View Code
Time limit(ms): 1000 Memory limit(kb): 65535
Description
将军听说最近东6闹鬼了,作为一个无神论者,将军当然不相信。但是这个传言已经泛滥了,许多人都在说这个事情,将军从每个人那里听到一个传言,将军可以容易的就知道这个传言是真还是假,但是当一大堆消息组合起来,将军就不知道了,所以将军就找到了你。
提供两种组合方式:
A&B:代表A和B都为真的时候,A和B组合起来为真,否则为假
A|B:代表A和B里面至少有1个为真的时候,A和B组合起来为真,否则为假
优先级顺序 “括号”>“&”>“|”
例如:a&b|(a|b&c),a=真,b=假,c=真;
那么上式可以这样转化
真&假 | (真|假&真)
假 | (真|假)
假 | 真
真
Input
有多组测试数据,每组测试数据共两行,第一行是一个逻辑范式,数据不用判错;
接下来三个字符,以空格隔开,分表代表a,b,c的真假(T/F);
Output
对于每一组数据,输出最终的结果(TRUE or FALSE);
Sample Input
a&b|(a|b&c)) T F T |
TRUE |
解题思路:更具a,b,c是否为真将其转换为1,0,再把中缀表达式转化为后缀表达式 ’|‘ 运算看做'+',把’&‘运算看做'*',然后看最后的结果就是~~~
代码如下:
#include<iostream> #include<cstring> #include<stack> using namespace std; char s[10001], v[10001], a, b, c; void get_val(char &x){ if (x == 'T') x = '1'; else x = '0'; } int judge(char x, char y){ if (x == '(') return -1; if (x == '+') return y == '*' ? -1 : 0; if (x == '*') return y == '+' ? 1 : 0; } void change(){ stack<char> Q; int i, k = 0; for (i = 0; s[i] != '\0'; i++){ if (s[i] == '(') Q.push(s[i]); else if (s[i] == ')'){ while (Q.top() != '('){ v[k++] = Q.top(); Q.pop(); } Q.pop(); } else{ if (s[i] != '*'&&s[i] != '+') v[k++] = s[i]; else{ while (!Q.empty() && judge(Q.top(), s[i]) >= 0){ v[k++] = Q.top(); Q.pop(); } Q.push(s[i]); } } } while (!Q.empty()){ v[k++] = Q.top(); Q.pop(); } v[k] = '\0'; //cout << v << endl; } int get_num(){ stack<int>Q; int i, x, y, val; for (i = 0; v[i] != '\0'; i++){ if (v[i] != '*'&&v[i] != '+') Q.push(v[i] - '0'); else{ x = Q.top(), Q.pop(); y = Q.top(), Q.pop(); switch (v[i]){ case '*':val = x*y; break; case '+':val = x + y; break; } Q.push(val); } } return Q.top(); } void mergy(char *s, char a, char b, char c){ for (int i = 0; s[i] != '\0'; i++){ if (s[i] == 'a')s[i] = a; if (s[i] == 'b')s[i] = b; if (s[i] == 'c')s[i] = c; if (s[i] == '&')s[i] = '*'; if (s[i] == '|')s[i] = '+'; } } int main(){ while (cin >> s){ cin >> a >> b >> c; get_val(a), get_val(b), get_val(c); mergy(s, a, b, c); change(); cout << (get_num() > 0 ? "TRUE\n" : "FALSE\n"); } return 0; }
View Code
相关文章推荐
- 移动APP最容易被程序猿忽略的五个安全问题
- python变量类型
- c和指针练习
- 多项式加法的Java实现
- 垂直的SeekBar:VerticalSeekBar
- wait,waitpid,waitid————等待进程改变状态
- Telnet/SSH to Fedore Server Very Slow
- Java 信任所有SSL证书(解决PKIX path building failed问题)
- 浏览器兼容性
- msyql 统计数据,并过滤重复数据
- 运用NI USRP打造出经济实惠的8x8 MIMO测试台
- Android-布局基础
- 定位问题
- xmlbeans解析XML文件全流程+Altova XMLSpy破解
- Python:自定义异常类
- 互联网的科学基础
- Android-基本布局
- 从编辑框获取内容
- word在线预览,文件在线预览,SWFTools
- 第五章 作业