#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *data;
int top;
int capacity;
} Stack;
Stack* createStack(int capacity) {
Stack
* s
= (Stack
*)malloc(sizeof(Stack
)); s -> capacity = capacity;
s -> top = -1;
s
-> data
= (char*)malloc(s
-> capacity
* sizeof(char)); return s;
}
int isEmpty(Stack* s) {
return s -> top == -1;
}
void push(Stack* s, char c) {
s -> data[++(s -> top)] = c;
}
char pop(Stack* s) {
if(isEmpty(s)) return '\0';
return s -> data[(s -> top)--];
}
void freeStack(Stack* s) {
}
int isMatching(char open, char close) {
return (open == '(' && close == ')') || (open == '[' && close == ']') || (open == '{' && close == '}');
}
int isValidParentheses(const char *s) {
Stack *st = createStack(len);
for(int i = 0; i < len; i++) {
char c = s[i];
if(c == '(' || c == '[' || c == '{') {
push(st, c);
}
else if(c == ')' || c == ']' || c == '}') {
if(isEmpty(st)) {
freeStack(st);
return 0;
}
char top = pop(st);
if(!isMatching(top, c)) {
freeStack(st);
return 0;
}
}
}
int result = isEmpty(st) ? 1 : 0;
freeStack(st);
return result;
}
void vanimain() {
char *s
= (char*)malloc(100005 * sizeof(char)); if(scanf("%100004s", s
) == 1) { printf("%d\n", isValidParentheses
(s
)); }
}
int main() {
vanimain();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdHlwZWRlZiBzdHJ1Y3QgewogICAgY2hhciAqZGF0YTsKICAgIGludCB0b3A7CiAgICBpbnQgY2FwYWNpdHk7Cn0gU3RhY2s7CgpTdGFjayogY3JlYXRlU3RhY2soaW50IGNhcGFjaXR5KSB7CiAgICBTdGFjayogcyA9IChTdGFjayopbWFsbG9jKHNpemVvZihTdGFjaykpOwogICAgcyAtPiBjYXBhY2l0eSA9IGNhcGFjaXR5OwogICAgcyAtPiB0b3AgPSAtMTsKICAgIHMgLT4gZGF0YSA9IChjaGFyKiltYWxsb2MocyAtPiBjYXBhY2l0eSAqIHNpemVvZihjaGFyKSk7CiAgICByZXR1cm4gczsKfQoKaW50IGlzRW1wdHkoU3RhY2sqIHMpIHsKICAgIHJldHVybiBzIC0+IHRvcCA9PSAtMTsKfQoKdm9pZCBwdXNoKFN0YWNrKiBzLCBjaGFyIGMpIHsKICAgIHMgLT4gZGF0YVsrKyhzIC0+IHRvcCldID0gYzsKfQoKY2hhciBwb3AoU3RhY2sqIHMpIHsKICAgIGlmKGlzRW1wdHkocykpIHJldHVybiAnXDAnOwogICAgcmV0dXJuIHMgLT4gZGF0YVsocyAtPiB0b3ApLS1dOwp9Cgp2b2lkIGZyZWVTdGFjayhTdGFjayogcykgewogICAgZnJlZShzIC0+IGRhdGEpOwogICAgZnJlZShzKTsKfQoKaW50IGlzTWF0Y2hpbmcoY2hhciBvcGVuLCBjaGFyIGNsb3NlKSB7CiAgICByZXR1cm4gKG9wZW4gPT0gJygnICYmIGNsb3NlID09ICcpJykgfHwgKG9wZW4gPT0gJ1snICYmIGNsb3NlID09ICddJykgfHwgKG9wZW4gPT0gJ3snICYmIGNsb3NlID09ICd9Jyk7Cn0KCmludCBpc1ZhbGlkUGFyZW50aGVzZXMoY29uc3QgY2hhciAqcykgewogICAgaW50IGxlbiA9IHN0cmxlbihzKTsKICAgIFN0YWNrICpzdCA9IGNyZWF0ZVN0YWNrKGxlbik7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICBjaGFyIGMgPSBzW2ldOwogICAgICAgIGlmKGMgPT0gJygnIHx8IGMgPT0gJ1snIHx8IGMgPT0gJ3snKSB7CiAgICAgICAgICAgIHB1c2goc3QsIGMpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGMgPT0gJyknIHx8IGMgPT0gJ10nIHx8IGMgPT0gJ30nKSB7CiAgICAgICAgICAgIGlmKGlzRW1wdHkoc3QpKSB7CiAgICAgICAgICAgICAgICBmcmVlU3RhY2soc3QpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2hhciB0b3AgPSBwb3Aoc3QpOwogICAgICAgICAgICBpZighaXNNYXRjaGluZyh0b3AsIGMpKSB7CiAgICAgICAgICAgICAgICBmcmVlU3RhY2soc3QpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaW50IHJlc3VsdCA9IGlzRW1wdHkoc3QpID8gMSA6IDA7CiAgICBmcmVlU3RhY2soc3QpOwogICAgcmV0dXJuIHJlc3VsdDsKfQoKdm9pZCB2YW5pbWFpbigpIHsKICAgIGNoYXIgKnMgPSAoY2hhciopbWFsbG9jKDEwMDAwNSAqIHNpemVvZihjaGFyKSk7CiAgICBpZihzY2FuZigiJTEwMDAwNHMiLCBzKSA9PSAxKSB7CiAgICAgICAgcHJpbnRmKCIlZFxuIiwgaXNWYWxpZFBhcmVudGhlc2VzKHMpKTsKICAgIH0KICAgIGZyZWUocyk7Cn0KCmludCBtYWluKCkgewogICAgdmFuaW1haW4oKTsKICAgIHJldHVybiAwOwp9