UVa 1596 Bug Hunt (STL栈)

题意:给定两种操作,一种是定义一个数组,另一种是赋值,让你找出哪一步时出错了,出错只有两种,一种是数组越界,另一种是访问未定义变量。

析:当初看到这个题时,感觉好麻烦啊,然后就放过去了,而现在要重新回来做一下,感觉也不好做,做了1个多小时。。。。。

现在分析一下是思路,我觉得我想的比较麻烦,我首先定义了两个map,分别是数组的最大长度和数组的,赋值情况,然后用向量把所有操作存起来,

在定义时很简单,直接把长度赋给map就行,麻烦就是在这个赋值时,首先是把等号两边的分开,先计算等号右边的操作,主要是观察有没有出错的地方,

特别注意的是有的变量可能没定义,这样就错了,第一次没考虑WA了,两边都要考虑,最后要把右边赋值给左边,最后还要注意左边可能没有定义,

一定要特判一下。

代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
#include <stack>
#include <string>
#include <queue>
#include <vector>
#include <cctype>
#include <sstream>

using namespace std;
map<string, int> mp;
map<char, int> maxlength;
vector<string> v;

int contain(const string &s){
    for(int i = 0; i < s.size(); ++i)
        if(‘=‘ == s[i])  return i;//等号位置
    return 0;
}

int cal(const string &s){
    int ans = 0;
    for(int i = 2; i < s.size(); ++i)//计算数组长度
        if(s[i] != ‘]‘)  ans = ans * 10 + s[i] - ‘0‘;
    return ans;
}

bool solve(string s, string ss){
    stack<char> character;
    int t = 0;
    for(int i = 0; i < ss.size(); ++i){
        if(isalpha(ss[i]))   character.push(ss[i]);//把数组放进去
        else if(‘[‘ == ss[i])  t = 0;
        else if(isdigit(ss[i]))  t = t * 10 + ss[i] - ‘0‘;//计算下标
        else if(‘]‘ == ss[i]){
            char ch = character.top();  character.pop();
            if(!maxlength.count(ch))  return false;//这个数组不存在
            if(maxlength[ch] <= t)  return false;//数组越界
            stringstream ss;  ss << t;//把int型转string
            string tt;  ss >> tt;
            string s1;  s1 = ch + tt;
            if(!mp.count(s1))  return false;//变量没定义
            t = mp[s1];
        }
    }

    int ans = t;  t = 0;
    while(!character.empty())  character.pop();
    for(int i = 0; i < s.size(); ++i){
        if(isalpha(s[i]))   character.push(s[i]);
        else if(‘[‘ == s[i])  t = 0;
        else if(isdigit(s[i]))  t = t * 10 + s[i] - ‘0‘;
        else if(‘]‘ == s[i]){
            char ch = character.top();  character.pop();
            stringstream ss;  ss << t;
            string tt;   ss >> tt;
            string s1;  s1 = ch + tt;
            if(!maxlength.count(ch))  return false;
            if(maxlength[ch] <= t)  return false;
            if(i == s.size()-1){  if(!maxlength.count(s1[0]))  return false;  mp[s1] = ans;  break; }
            if(!mp.count(s1))  return false;
            t = mp[s1];
        }
    }
    return true;
}

int main(){
//    freopen("in.txt", "r", stdin);
    string s;
    while(cin >> s && s != "."){
        mp.clear();
        maxlength.clear();
        v.clear();
        v.push_back(s);
        while(cin >> s && s != ".")  v.push_back(s);
        bool ok = false;
        for(int i = 0; i < v.size(); ++i){
            s = v[i];
            int t = contain(s);//计算等号的位置
            if(t){
                string s1 = s.substr(0, t);//等号左边
                string s2 = s.substr(t+1, string::npos);//等号右边
                if(!solve(s1, s2)){  ok  = true;  printf("%d\n", i+1);  break; }//出错了
            }
            else  maxlength[s[0]] = cal(s);//定义数组
        }
        if(!ok){  printf("0\n");  }
    }
    return 0;
}
时间: 2024-10-21 11:19:28

UVa 1596 Bug Hunt (STL栈)的相关文章

UVA 1596 Bug Hunt (大模拟 栈)

题意: 输入并模拟执行一段程序,输出第一个bug所在的行. 每行程序有两种可能: 数组定义: 格式为arr[size]. 例如a[10]或者b[5],可用下标分别是0-9和0-4.定义之后所有元素均为未初始化状态. 赋值语句: 格式为arr[index]=value. 或者arr[index] = arr[arr[index]]. 例如a[0]=3或者a[a[0]]=a[1]. 赋值语句和数组定义可能会出现两种bug: 下标index越界: 使用未初始化的变量(index和value都可 能出现

uva 1596 Bug Hunt

In this problem, we consider a simple programming language that has only declarations of one-dimensional integer arrays and assignment statements. The problem is to find a bug in the given program. The syntax of this language is given in BNF as follo

【技巧性(+递归运用)】UVa 1596 - Bug Hunt

In this problem, we consider a simple programming language that has only declarations of onedimensional integer arrays and assignment statements. The problem is to find a bug in the given program. The syntax of this language is given in BNF as follow

UVa 1596 Bug Hunt (string::find &amp;&amp; map &amp;&amp; 模拟)

题意:给出几组由数组定义与赋值构成的编程语句, 有可能有两种BUG, 第一种为数组下标越界, 第二种为使用尚未定义的数组元素, 叫你找出最早出现BUG的一行并输出, 每组以' . '号分隔, 当有两组输入都是' . '时结束程序 分析:由于错误的类型由题意所述的两种组成, 所以我们需要知道每个数组的长度与每个已经被赋值定义过的数组元素大小, 因此可以定义map<string, int> Info 来存储数组名和这个数组的大小两个信息, 在定义一个map<string, map<in

Uva - 1513 Moive collection ( 模拟栈 + 树状数组基本操作 )

Uva - 1513 Moive collection ( 模拟栈 + 树状数组基本操作 ) 题意: 一个书架,原来所有的书都是按顺序摆好的,书的编号从1开始到n 操作: 取出一本书,统计在这本书之前有多少本书,统计完之后,将这本书放在书架的第一位. 如:  1 2 3 4 5取4   4 1 2 3 5 (取之前,有3本书在4前面,取完后,将4放在栈顶)取4   4 1 2 3 5 (取之前,有0本书在4前面,取完后,将4放在栈顶)取2   2 4 1 3 5 (取之前,有2本书在2前面,取完

UVA - 673 - Parentheses Balance (栈的应用!)

UVA - 673 Parentheses Balance Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description  Parentheses Balance  You are given a string consisting of parentheses () and []. A string of this type is said to be co

STL栈、队列、优先队列—————基础知识

0基本特点:后进先出(LIFO) 注意: 不一定最先进栈的最后出栈,只要保证是栈顶元素出栈就行! 当栈中存在一个元素时,top=0,因此通常把空栈的判定条件定为top= - 1: STL 中栈的使用方法: 头文件:#include <stack> 基本操作: push(x) 将x加入栈中,即入栈操作 pop() 出栈操作(删除栈顶),只是出栈,没有返回值 top() 返回第一个元素(栈顶元素) size() 返回栈中的元素个数 empty() 当栈为空时,返回 true STL 中队列的使用(

UVa第五章STL应用 习题((解题报告))详细!

例题5--9 数据库 Database UVa 1592 <strong><span style="font-size:18px;"><span style="font-size:18px;"><strong><span style="font-size:18px;">#include<iostream> #include<string> #include<

UVA 637 Parentheses Balance(栈)

题目代号:HDU 1237 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=614 题目原文: Parentheses Balance You are given a string consisting of parentheses () and []. A string of this type