翻译布尔表达式

翻译布尔表达式
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description

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

多组输入,首先输入一个整数T,代表数据组数。

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

每个符号都用空格间隔。
Output

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

1
a < b or c < d and e < f

Sample Output

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

Hint
Source

#include<bits/stdc++.h>
#include<vector>
using namespace std;

int temp ;
int jump;
string str;
vector<string>tt;//这个vector相当于是一个容器。相当于一个字符串数组
int main()
{
    int t;
    scanf("%d\n",&t);//注意这里输入必须要加一个\n,不然会后面getline会将\n读入从而出现错误。
    while(t--)
    {
        getline(cin,str);//getline函数,相当于用cin流对象输入一个行空格的字符串,如果用cin输入遇到空格则停止输入。
        jump=1,temp=0;//jump用来标记真出口,temp用来标记假出口
        int id=100;//初始化位置

        str=str+" end";//注意这里有个空格,且加一个end判断是是否读到字符串末尾
        stringstream ss(str);//类似于将含空格的字符串保存为,按空格分裂的字符穿数组,类似于java中的splic(" ")函数,比如"hello world",保存为ss[0]="hello",ss[1]="world",意思就是这么理解
        string s;
        while(ss>>s)//这个就类似于一个字符串一个字符串读入,
        {
            if(s=="or")//如果时or则将保存到容器的字符串输出
            {
                printf("%d(j%s,%s,%s,%d)\n",id,tt[1].c_str(),tt[0].c_str(),tt[2].c_str(),jump);//or中有表达式为真,则整个表达式都为真,跳转到真出口jump
                jump=id++;//此时四元式的id就是真出口,他后面的真出口跳转到他的id
                printf("%d(j,_,_,%d)\n",id,id+1);//不满足则跳转到id+1
                id++;
                tt.clear();//清空容器,用来保存其他表达式

            }else if(s=="and")//如果时and也是输出
            {
                printf("%d(j%s,%s,%s,%d)\n",id,tt[1].c_str(),tt[0].c_str(),tt[2].c_str(),id+2);//and为真则跳转到id+2
                id++;
                printf("%d(j,_,_,%d)\n",id,temp);//为假则跳转到假出口
                temp=id++;
                tt.clear();

            }else if(s=="end")
            {
                printf("%d(j%s,%s,%s,%d)\n",id,tt[1].c_str(),tt[0].c_str(),tt[2].c_str(),jump);
                id++;
                printf("%d(j,_,_,%d)\n",id,temp);
                tt.clear();//每次都要清空,因为还要保存后面的and与and或者and与or之间的字符串
            }else//这里就时相当于如果不是and或者or或者end则保存起来,类似于保存到字符串数组中,如果遇到and/or/end则输出保存到tt容器中的字符串内容,然后清空clear()。
            tt.push_back(s);

        }

    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值