M - 翻译布尔表达式 Description 大家都学过了布尔表达式的翻译,其中有一个拉链-回填技术,这次我们就练习这个技术。
Input
代码语言:javascript复制输入为一行字符串,例如: a < b or c < d and e < f
每个符号都用空格间隔。
其中逻辑运算符包含 and 和 or , 关系运算符包含 < 、> 、<= 、 >= 、== 、 != 。
Output
代码语言:javascript复制 假链跳到0,真链跳到1,表达式序号从100开始排。
Sample
代码语言:javascript复制Input
a < b or c < d and e < f
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)
代码语言:javascript复制#include<bits/stdc .h>
using namespace std;
vector<string>tt;
int main()
{
int yes =1,no =100,num =100;
string a;
getline(cin,a);
a = " end";//加个终止符号 !!!end前面容易漏空格!!!
stringstream ss(a);//a赋值给ss,
string s;
while(ss >> s)//ss 以空格间隔输出 字符/字符串 并赋值给s
{
if(s == "or" || s == "end")// 习惯写成if(s =="or"||"end")
{
if(s == "or")no = 2;
else no = 0;
int n =tt.size();
for (int i = 0; i < n-3; i = 3) //除了最后三个 肯定是end情况(即最后表达式决定最终表达式整体真假),其余的都是or和and情况,在循环里解决的是and情况
{
printf("%d(j%s,%s,%s,%d)n",num,tt[i 1].c_str(),tt[i].c_str(),tt[i 2].c_str(),num 2);//and 真--通过 num 继续
num ;
printf("%d(j,_,_,%d)n",num,no);//and 假--跳转
no = num ;
}
printf("%d(j%s,%s,%s,%d)n",num,tt[n-2].c_str(),tt[n-3].c_str(),tt[n-1].c_str(),yes);//orend情况 真--跳转
yes = num ;
printf("%d(j,_,_,%d)n",num,no);//end情况 为假 --跳转 ||or情况 为假的 --通过 no 继续
num ;
tt.clear();
if(s == "end")break;//需要写终止条件
}
else if(s == "and")no =2;//存一下,去or的情况下处理再一起处理
else tt.push_back(s);
}
}