翻译布尔表达式
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);
}
}
}