翻译布尔表达式

7-14 翻译布尔表达式

大家都学过了布尔表达式的翻译,其中有一个拉链-回填技术,这次我们就练习这个技术。

注意,在布尔表达式中,“并且”运算的优先级是要高于“或者”运算的。

输入格式:

输入为一行字符串,例如: a < b or c < d and e < f

每个符号都用空格间隔。

其中逻辑运算符包含 and 和 or , 关系运算符包含 < 、> 、<= 、 >= 、== 、 != 。

输出格式:

假链跳到0,真链跳到1,表达式序号从100开始排。

输入样例1:

a < b or c < d and e < f

输出样例1:

100(j<,a,b,1)
101(j,_,_,102)
102(j<,c,d,104)
103(j,_,_,0)
104(j<,e,f,100)
105(j,_,_,103)

输入样例2:

a < b and c > d or e > f

输出样例2:

100(j<,a,b,102)
101(j,_,_,104)
102(j>,c,d,1)
103(j,_,_,101)
104(j>,e,f,102)
105(j,_,_,0)

代码:

#include <bits/stdc++.h>
using namespace std;
#define tochars(s) s.c_str()
string s[200], temp[200];
int cnt;
signed main()
{
    while (cin >> s[cnt++]) ;
    int True_list = 1, False_list = 100, id = 100;
    vector<string> temp;
    for (int i = 0; i < cnt; i++)
    {
        if (s[i] == "or" || i == cnt - 1)
        {
            if (s[i] == "or")
                False_list += 2;
            else
                False_list = 0;
            for (int j = 0; j < temp.size() - 3; j += 3)
            {
                printf("%d(j%s,%s,%s,%d)\n", id++, tochars(temp[j + 1]), tochars(temp[j]), tochars(temp[j + 2]), id + 2);
                printf("%d(j,_,_,%d)\n", id, False_list);
                False_list = id++;
            }
            int j = temp.size() - 3;
            printf("%d(j%s,%s,%s,%d)\n", id, tochars(temp[j + 1]), tochars(temp[j]), tochars(temp[j + 2]), True_list);
            True_list = id++;
            printf("%d(j,_,_,%d)\n", id++, False_list);
            temp.clear();
        }
        else if (s[i] == "and")
            False_list += 2;
        else
            temp.push_back(s[i]);
    }
}
posted @ 2022-10-28 15:06  zzh1206  阅读(158)  评论(0)    收藏  举报