zoukankan      html  css  js  c++  java
  • [Swust OJ 322]--东6宿舍灵异事件(中缀表达式转化为后缀表达式的简单运用)

    题目链接: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
    a&b|(a|b&c))
    T F T

    Sample Output
    TRUE

     
    SCPC - ChenYi
     
    解题思路:更具a,b,c是否为真将其转换为1,0,再把中缀表达式转化为后缀表达式 ’|‘ 运算看做'+',把’&‘运算看做'*',然后看最后的结果就是~~~
     
    代码如下:
     1 #include<iostream>
     2 #include<cstring>
     3 #include<stack>
     4 using namespace std;
     5 char s[10001], v[10001], a, b, c;
     6 void get_val(char &x){
     7     if (x == 'T')
     8         x = '1';
     9     else
    10         x = '0';
    11 }
    12 int judge(char x, char y){
    13     if (x == '(') return -1;
    14     if (x == '+')
    15         return y == '*' ? -1 : 0;
    16     if (x == '*')
    17         return y == '+' ? 1 : 0;
    18 }
    19 void change(){
    20     stack<char> Q;
    21     int i, k = 0;
    22     for (i = 0; s[i] != ''; i++){
    23         if (s[i] == '(')
    24             Q.push(s[i]);
    25         else if (s[i] == ')'){
    26             while (Q.top() != '('){
    27                 v[k++] = Q.top();
    28                 Q.pop();
    29             }
    30             Q.pop();
    31         }
    32         else{
    33             if (s[i] != '*'&&s[i] != '+')
    34                 v[k++] = s[i];
    35             else{
    36                 while (!Q.empty() && judge(Q.top(), s[i]) >= 0){
    37                     v[k++] = Q.top();
    38                     Q.pop();
    39                 }
    40                 Q.push(s[i]);
    41             }
    42         }
    43     }
    44     while (!Q.empty()){
    45         v[k++] = Q.top();
    46         Q.pop();
    47     }
    48     v[k] = '';
    49     //cout << v << endl;
    50 }
    51 int get_num(){
    52     stack<int>Q;
    53     int i, x, y, val;
    54     for (i = 0; v[i] != ''; i++){
    55         if (v[i] != '*'&&v[i] != '+')
    56             Q.push(v[i] - '0');
    57         else{
    58             x = Q.top(), Q.pop();
    59             y = Q.top(), Q.pop();
    60             switch (v[i]){
    61             case '*':val = x*y; break;
    62             case '+':val = x + y; break;
    63             }
    64             Q.push(val);
    65         }
    66     }
    67     return Q.top();
    68 }
    69 void mergy(char *s, char a, char b, char c){
    70     for (int i = 0; s[i] != ''; i++){
    71         if (s[i] == 'a')s[i] = a;
    72         if (s[i] == 'b')s[i] = b;
    73         if (s[i] == 'c')s[i] = c;
    74         if (s[i] == '&')s[i] = '*';
    75         if (s[i] == '|')s[i] = '+';
    76     }
    77 }
    78 int main(){
    79     while (cin >> s){
    80         cin >> a >> b >> c;
    81         get_val(a), get_val(b), get_val(c);
    82         mergy(s, a, b, c);
    83         change();
    84         cout << (get_num() > 0 ? "TRUE
    " : "FALSE
    ");
    85     }
    86     return 0;
    87 }
    View Code
     
  • 相关阅读:
    《疯狂的程序员》二
    《当程序员的那些狗日日子》五
    《疯狂的程序员》九
    《疯狂的程序员》一
    《疯狂的程序员》三
    和菜鸟一起学算法之递归和分治简单实例
    《疯狂的程序员》八
    《当程序员的那些狗日日子》四
    开放源代码软件利润高于专有代码
    少年黑客破解Google视频播放器
  • 原文地址:https://www.cnblogs.com/zyxStar/p/4581566.html
Copyright © 2011-2022 走看看