一道比较简单的STL练习题。
开2个map 一个存数组大小,一个map<string,map<int,int>>存数组的元素是否存在以及值
输入不存在负数的情况,纯代码题
#include<cstdio> #include<cstring> #include<map> #include<vector> #include<string> #include<queue> #include<iostream> #include<stack> using namespace std; const int maxn = 101; char str[maxn]; int cases = 1; int ans = 0; map<string,int>arr_size; //数组的大小 map<string,map<int,int> >arr; //数组的元素 int dfs(char *s,int a,int b){ char name[maxn]; int pos = 0; for(int i = a; i < b; i++){ if(s[i] != '[') name[pos++] = s[i]; else{ int e = dfs(s,i + 1,b - 1); //数组下标 if(e < 0) return -1; string sstr(name,0,pos); //数组名称 int ssize = arr_size[sstr]; //数组大小 if(ssize < e) return -1; if(!arr[sstr].count(e)) return -1; return arr[sstr][e]; } } int re = 0; for(int i = 0; i < pos; i++) re = re * 10 + name[i] - '0'; return re; } //鉴定语句 int judge(char *s,int l){ int value = 0,pos = 0; char name[maxn]; for(int i = 0; i < l; i++){ if(s[i] == '=') return i; //返回等号的位置 else if(s[i] >= '0' && s[i] <= '9') value = value * 10 + s[i] - '0'; else if(s[i] != '[' && s[i] != ']') name[pos++] = s[i]; } string na(name,0,pos); arr_size[na] = value; return -1; } bool solve(char *str){ char name[maxn]; int pos = 0; int L = strlen(str); int op = judge(str,L); if(op >= 0){ pos = 0; for(int i = 0; i < L; i++) if(str[i]!= '[') name[pos++] = str[i]; else break; int e1 = dfs(str,pos + 1,op - 1); int e2 = dfs(str,op + 1,L); string my(name,0,pos); int ssize = arr_size[my]; if(e1 == -1 || e2 == -1 || e1 >= ssize) if(!ans) ans = cases; else arr[my][e1] = e2; } } int main(){ while(scanf("%s",str) && str[0] != '.'){ cases = 1; ans = 0; arr_size.clear(); arr.clear(); solve(str); while(scanf("%s",str) && str[0] != '.'){ cases ++; solve(str); } printf("%d\n",ans); } return 0; }
原文:http://blog.csdn.net/u013451221/article/details/44621547