大家都学过了布尔表达式的翻译,其中有一个拉链-回填技术,这次我们就练习这个技术。
Input 输入为一行字符串,例如: a < b or c < d and e < f
每个符号都用空格间隔。
其中逻辑运算符包含 and 和 or , 关系运算符包含 < 、> 、<= 、 >= 、== 、 != 。
Output 假链跳到0,真链跳到1,表达式序号从100开始排。
Sample Input
a < b or c < d and e < fSample 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) #include <bits/stdc++.h> using namespace std; string a,x; vector<string>d; int main() { int t; int id,yes,no; getline(cin,a); a+=" ed"; id=100; yes=1; no=100; stringstream b(a); while(b>>x) { if(x=="or"||x=="ed") { if(x=="or")no+=2; else no=0; int n=d.size(); for(int i=0;i<n-3;i+=3) { printf("%d(j%s,%s,%s,%d)\n",id,d[i+1].c_str(),d[i].c_str(),d[i+2].c_str(),id+2); id++; printf("%d(j,_,_,%d)\n", id, no); no=id++; } printf("%d(j%s,%s,%s,%d)\n",id,d[n-2].c_str(),d[n-3].c_str(),d[n-1].c_str(),yes); yes=id++; printf("%d(j,_,_,%d)\n", id, no); id++; d.clear(); if(x=="ed")break; } else if(x=="and") no+=2; else d.push_back(x); } return 0; }