#include <iostream>
#include <string.h>
using namespace std;
#define error -1
#define correct 1
#define maxstacksize 100
typedef struct sqstack {
char base[maxstacksize];
char* top;
} sqstack;
sqstack mbstack;
int initstack(sqstack& s) {
s.top = s.base;
return correct;
}
int push(sqstack& s, char e) {
if ((s.top - s.base) >= maxstacksize) return error;
*s.top++ = e;
return correct;
}
int pop(sqstack& s, char& e) {
if (s.top <= s.base) return error;
e = *--s.top;
return correct;
}
int stackempty(sqstack& s) {
return (s.top == s.base) ? correct : error;
}
int matchbracket(sqstack& s, char* bracketstring) {
int i;
char c, sc;
initstack(s);
for (i = 0; i < strlen(bracketstring); i++) {
c = bracketstring[i];
if (c == '(' || c == '[' || c == '{') {
push(s, c);
}
if (c == ')' || c == ']' || c == '}') {
if (stackempty(s) == correct) return -2; // 右括号多于左括号
pop(s, sc);
if ((c == ')' && sc != '(') ||
(c == ']' && sc != '[') ||
(c == '}' && sc != '{')) {
return -1; // 左右括号配对次序不正确
}
}
}
return (stackempty(s) == correct) ? 0 : -3; // 左括号多于右括号
}
int main() {
int i, samplenum;
char bracketstring[maxstacksize];
cin >> samplenum;
for (i = 0; i < samplenum; i++) {
cin >> bracketstring;
cout << matchbracket(mbstack, bracketstring) << endl;
}
return 0;
}
//输入:4
//输入:{[(1+2)*3]-1}
//输出:0
//输入:{[(1+2]*3-1}
//输出:-1
//输入:(1+2)*3)-1}
//输出:-2
//输入:{[(1+2)*3-1]
//输出:-3