出处:https://blog.csdn.net/majing19921103/article/details/44409711
题目链接:https://vjudge.net/contest/231030#problem/I
输入并模拟一段程序,输出第一个bug所在的行。每行程序有两种可能:
数组定义:格式为arr[size],例如a[10];
赋值语句:格式为arr[index]=value,例如a[0]=3或者a[a[0]]=3
赋值语句可能会出现两种bug:下标index越界,使用未初始化变量。
思路:本题有两个关键点,首先在于程序中已经出现的数组以及已经赋值过的元素的存储,可以采用两个map完成,map<string,int>存储数组名和数组大小,map<string,map<int,int>>存储数组名以及其对应的已经赋值过得元素。其次在于计算数组的下标(下标的值可能是多层嵌套),这里可以利用栈轻松完成。
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <sstream>
#include <fstream>
#include <stack>
using namespace std;
map<string, long long> array_table;
map<string,map< long long, long long>> array_value_table;
#define FILE
void partition(string origin,string &left,string &right)
{
int index = origin.find_first_of('=',0);
if(index!=-1)
{
left = origin.substr(0,index);
right = origin.substr(index+1);
}
else
{
left = origin;
right = "";
}
}
void getArray(string str,string &name, string &value)
{
int begin = str.find_first_of('[',0);
int end = str.find_last_of(']');
if(begin!=-1)
{
name = str.substr(0,begin);
value = str.substr(begin+1,end-begin-1);
}
else
{
name = "";
value = str;
}
}
bool isValue(string value)
{
int index = value.find_first_of('[',0);
if(index!=-1)
return true;
return false;
}
long long calculateArray(string str)
{
string name,value;
getArray(str,name,value);
stack<string> s;
long long ans;
while(name!="")
{
string left,right;
getArray(value,left,right);
if (array_table.count(name)==0)
{
return -1;
}
value = right;
s.push(name);
name = left;
}
ans = atoi(value.c_str());
if(ans<0)
return -1;
while (!s.empty())
{
string left = s.top();
long long num = array_table[left];
if(ans>=num)
return -1;
if(array_value_table[left].count(ans)==0)
return -1;
ans = array_value_table[left][ans];
s.pop();
}
return ans;
}
int main(int argc, char* argv[])
{
#ifdef FILE
ifstream in("data.txt");
ofstream out("output.txt");
cin.rdbuf(in.rdbuf());
cout.rdbuf(out.rdbuf());
#endif
string str;
bool mark = false,isfirst = true;
int num = 0;
while(cin>>str)
{
if(str!=".")
{
mark = false;
num++;
string left,right;
partition(str,left,right);
if(right=="")
{
string name,value;
getArray(left,name,value);
array_table[name] = atoi(value.c_str());
}
else
{
string name, value;
long long ans,temp;
getArray(left,name,value);
temp = calculateArray(value);
ans = calculateArray(right);
if(temp>=0&&temp<array_table[name]&&ans!=-1)
{
array_value_table[name][temp] = ans;
}
else
{
if(isfirst)
{
cout<<num<<endl;
isfirst = false;
}
}
}
}
else
{
array_table.clear();
array_value_table.clear();
if(mark)
break;
else
{
if(isfirst)
cout<<0<<endl;
mark = true;
isfirst = true;
num = 0;
}
}
}
return 0;
}