UVa:1596 - Bug Hunt

题目描述:

输入并模拟一段程序,输出第一个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>>存储数组名以及其对应的已经赋值过得元素。其次在于计算数组的下标(下标的值可能是多层嵌套),这里可以利用栈轻松完成。


另外,前两次提交一直WA,原来是忘了在新的程序清空map,程序如下:


#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;
}



你可能感兴趣的:(map,栈,uva)