题目:
描述
面条编程语言仅由3种语句组成:PRINT、GOTO、END
定义如下:
PRINT [string] : 程序输出[string],一个不含空格的字符串
GOTO [number] : 程序跳转到行号为[number]的语句执行
END : 程序结束
编写一个该面条编程语言的解释器,输入程序,输出程序运行结果,若程序不能正常结束(未执行到END语句),输出ERROR
输入
一段面条编程程序,由上述语句组合而成,行数不多于100000
输出
程序运行结果,即程序执行过程中PRINT语句输出的内容或ERROR
样例输入1
PRINT 1 GOTO 4 GOTO 2 PRINT ? END
样例输出1
1 ?
样例输入2
PRINT 1 GOTO 4 PRINT 3 PRINT 4
样例输出2
ERROR
思路:
看似很简单,只要getline然后判断就行。但是!题目有坑!题目没有给出什么时候结束输入!然后去问了一下学长,学长说是文件结束。就是,,会自动结束的意思。所以我放弃了getline。用while(cin>>)先输入前面的PRINT之类的词,然后如果第一个单词是P就输入一个字符,把字符放在结构体里。如果第一个单词是G,就输入一个数字,也放在结构体里。结构体中包含一个字符串,用于输出;两个整形,用于GOTO另一行以及判断是哪一个面条编程语句;还有一个逻辑型,用于判断有没有GOTO循环(这个我一开始没有想到,于是一直超时,还以为是输入的问题),GOTO循环就是第二句到第四句,第四句又重新到第二句。结束这一步后,用一个n来判断是否需要输出语句。假如已经输出过了ERROR,就不用输出那些字符串了。字符串我放在了一个动态数组里,当然也可以用队列。
代码:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct ss
{
int a,to;
string out;
bool ph=0;
}p[100001];
int main()
{
vector <string>qu;
string shuru;
int number=0;
while(cin>>shuru)
{
number++;
if(shuru[0]=='P')
{
p[number].a=1;
string q;
cin>>q;
p[number].out=q;
}
if(shuru[0]=='G')
{
p[number].a=2;
int q;
cin>>q;
p[number].to=q;
}
if(shuru[0]=='E')
{
p[number].a=3;
}
}
int t=1;
int n=0;
while(t>0)
{
if(t>number||p[t].ph==1){n=1,cout<<"ERROR"<<endl;break;}
p[t].ph=1;
if(p[t].a==3)break;
if(p[t].a==1)qu.push_back(p[t].out),t++;
if(p[t].a==2)t=p[t].to;
}
if(n==0)//遍历动态数组,并输出。(嘛,想想还是队列简单点)
{
vector<string>::iterator it;
for(it=qu.begin();it!=qu.end();it++)
cout<<*it<<endl;
}
return 0;
}