一道比较简单的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;
}