M - 翻译布尔表达式
Description
大家都学过了布尔表达式的翻译,其中有一个拉链-回填技术,这次我们就练习这个技术。
Input
输入为一行字符串,例如: a < b or c < d and e < f
每个符号都用空格间隔。
其中逻辑运算符包含 and 和 or , 关系运算符包含 < 、> 、<= 、 >= 、== 、 != 。
Output
假链跳到0,真链跳到1,表达式序号从100开始排。
Sample
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)
//因为不知道变量是多长的字符串,因此以string类型存每一个
//所以用vector<string> 可以简单的认为,vector是一个能够存放任意类型的动态数组。
//vector<int> 容器中存放一个个int数字
// vector<string>容器中存放一个个字符串
//string类型的字符串不能用scanf输入printf直接输出--->.c_str()这样就能输出啦
//string类型的字符串可以直接比较不用strcmp()函数
/*
stringstream 流
可以完成:
(1)数据类型转换
string a="123";int b;
stringstream ss;
ss<<a; //string型进入
ss>>b; //int型出来
cout<<b<<endl; //123
(2)多个字符串拼接
string a="hello"
string b="world"
stringstream ss;
ss<<a<<" "<<b;
cout<<ss.str()<<endl;
-----------------------
stringstream ss;
ss<<str;//将str放入ss流中
while(ss>>s) //会以空格做间断,放入s串中
{
cout<<s<<endl;
}
(3)
ss.str()展示流中的元素
ss.str("")流中置为空
*/
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
vector<string> v;
int main()
{
string str,s;
stringstream ss;
getline(cin,str);
str+=" ed";
ss<<str;
int cnt=100;
int yes=1,no=100;
//在遇到or前的and 在false链
while(ss>>s)
{
if(s=="ed"||s=="or")
{
if(s=="or") no+=2;
else no=0;
int len=v.size();
for(int i=0;i<len-3;i+=3)//每3个为一组
{
printf("%d(j%s,%s,%s,%d)\n",cnt,v[i+1].c_str(),v[i].c_str(),v[i+2].c_str(),cnt+2);
cnt++;
printf("%d(j,_,_,%d)\n",cnt,no);
no=cnt;cnt++;
}
printf("%d(j%s,%s,%s,%d)\n",cnt,v[len-2].c_str(),v[len-3].c_str(),v[len-1].c_str(),yes);
yes=cnt;cnt++;
printf("%d(j,_,_,%d)\n",cnt,no);//no的循环在此结束
cnt++;
v.clear();
}
else if(s=="and")
{
no+=2;
}
else
{
v.push_back(s);
}
}
return 0;
}