紫书第五章习题5-9 UVa1596-找bug

出处: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;  
}

猜你喜欢

转载自blog.csdn.net/JXUFE_ACMer/article/details/80465129