#include <iostream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
map<string, int> arrname;
map<string, map< int, int> > mmp;
bool GetNum(string& temp, int nStart, int nEnd, int &num) {
stack<string> ns;
num = 0;
string name = "";
for (int i = nStart; i < nEnd; ++i) {
//记录数字
if (isdigit(temp[i])) num = num * 10 + (temp[i] - '0');
//记录数组名
else if (isalpha(temp[i])) name += temp[i];
//嵌套数组
else if (temp[i] == '[') { if (arrname.count(name) == 0) return false; ns.push(name); name = ""; }
//依次出栈
else if (temp[i] == ']') {
name = ns.top(); ns.pop();
if (mmp[name].count(num) == 0) return false;
num = mmp[name][num];
}
}
return true;
}
int Check(string& temp) {
int eq = temp.find('='), len = temp.size();
//没有= 是定义
if (eq == string::npos) {
int cnt = 0;
//数组名
string name = "";
name = temp[0];
//数组大小
for (int i = 2; temp[i] != ']'; i++) cnt = cnt * 10 + (temp[i] - '0');
if (cnt < 0 || arrname.count(name)) return 1;
//记录数组名 及其 大小
arrname[name] = cnt;
}
else {
//是赋值
string leftname = "", rightname = "";
int leftNum = 0, rightNum = 0;
//记录右数组名
if(isalpha(temp[eq +1]))rightname = temp[eq + 1];
//找右边数值
if (GetNum(temp, eq + 1, len, rightNum) == false) return 1;
//保存左数组名
leftname = temp[0];
//左数组名是否已定义
if (arrname.count(leftname) == 0) return 1;
//找左数组下标 下标是否合法
if(GetNum(temp, 2, eq - 1, leftNum) == false || leftNum < 0 || arrname[leftname] <= leftNum) return 1;
//保存左下标赋值
mmp[leftname][leftNum] = rightNum;
}
return 0;
}
int main()
{
int last = 0;
string temp = "";
while (true) {
int ret = 0,count = 1;
arrname.clear();
mmp.clear();
while (cin >> temp && temp[0] != '.') {
last = temp[0];
if (!ret && Check(temp)) ret = count;
++count;
}
if (last == '.') break;
cout << ret << endl;
last = temp[0];
}
return 0;
}
习题5-9(uva-1596)
最新推荐文章于 2021-04-13 16:17:47 发布
268

被折叠的 条评论
为什么被折叠?



