#include <stdio.h>
#include <stdlib.h>
// スタックの要素ひとつを表す構造体
typedef struct node {
char data;
struct node *next;
} Node;
// intデータを保持するスタック
typedef struct stack {
Node *top;
} Stack;
// スタックの初期化
void initStack(Stack *s) { s->top = NULL; }
// プッシュ
int push(Stack *s, char newdata) {
Node
*newNode
= (Node
*)malloc(sizeof(Node
)); if (newNode == NULL) { // メモリ領域の確保に失敗したとき
return -1; // 異常値 -1 を呼び出し元に返す
}
newNode->data = newdata;
newNode->next = s->top;
s->top = newNode;
return 0;
}
// スタックが空か?
int isEmpty(Stack *s) { return s->top == NULL; }
// ポップ
int pop(Stack *s, char *poppedData) {
if (isEmpty(s)) {
return -1;
}
Node *poppedNode = s->top;
*poppedData = poppedNode->data;
s->top = poppedNode->next;
return 0;
}
// ピーク
int peek(Stack *s, char *topData) {
if (isEmpty(s)) {
return -1;
}
*topData = s->top->data;
return 0;
}
// スタックの内容を表示
void printStack(Stack *s) {
Node *current = s->top;
while (current != NULL) {
current = current->next;
}
}
// メモリの解放
void freeStack(Stack *s) {
Node *current = s->top;
while (current != NULL) {
Node *tmp = current;
current = current->next;
}
s->top = NULL;
}
int checkParentheses(char str[]) {
Stack s;
initStack(&s);
int result = 1;
for (int i = 0; str[i] != '\0'; i++) {
char c = str[i];
if (c == '(' || c == '[') {
if (push(&s, c) != 0) {
result = 0;
break;
}
}else if (c == ')' || c == ']') {
char popped;
if (isEmpty(&s)) {
result = 0;
break;
}
pop(&s, &popped);
if (!((c == ')' && popped == '(') || (c == ']' && popped == '['))) {
result = 0;
break;
}
}
}
if (result == 1 && !isEmpty(&s)) {
result = 0;
}
freeStack(&s); // スタックのメモリを解放
return result;
}
int main(void) {
char str1[] = "(a[b(c)])";
char str2[] = "([)]";
char str3[] = "([()]";
printf("%s のチェック結果: %d\n", str1
, checkParentheses
(str1
)); printf("%s のチェック結果: %d\n", str2
, checkParentheses
(str2
)); printf("%s のチェック結果: %d\n", str3
, checkParentheses
(str3
)); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCi8vIOOCueOCv+ODg+OCr+OBruimgee0oOOBsuOBqOOBpOOCkuihqOOBmeani+mAoOS9kwp0eXBlZGVmIHN0cnVjdCBub2RlIHsKICBjaGFyIGRhdGE7CiAgc3RydWN0IG5vZGUgKm5leHQ7Cn0gTm9kZTsKCi8vIGludOODh+ODvOOCv+OCkuS/neaMgeOBmeOCi+OCueOCv+ODg+OCrwp0eXBlZGVmIHN0cnVjdCBzdGFjayB7CiAgTm9kZSAqdG9wOwp9IFN0YWNrOwoKLy8g44K544K/44OD44Kv44Gu5Yid5pyf5YyWCnZvaWQgaW5pdFN0YWNrKFN0YWNrICpzKSB7IHMtPnRvcCA9IE5VTEw7IH0KCi8vIOODl+ODg+OCt+ODpQppbnQgcHVzaChTdGFjayAqcywgY2hhciBuZXdkYXRhKSB7CiAgTm9kZSAqbmV3Tm9kZSA9IChOb2RlICopbWFsbG9jKHNpemVvZihOb2RlKSk7CiAgaWYgKG5ld05vZGUgPT0gTlVMTCkgeyAgLy8g44Oh44Oi44Oq6aCY5Z+f44Gu56K65L+d44Gr5aSx5pWX44GX44Gf44Go44GNCiAgICByZXR1cm4gLTE7ICAgICAgICAgICAgLy8g55Ww5bi45YCkIC0xIOOCkuWRvOOBs+WHuuOBl+WFg+OBq+i/lOOBmQogIH0KCiAgbmV3Tm9kZS0+ZGF0YSA9IG5ld2RhdGE7CiAgbmV3Tm9kZS0+bmV4dCA9IHMtPnRvcDsKICBzLT50b3AgPSBuZXdOb2RlOwogIHJldHVybiAwOwp9CgovLyDjgrnjgr/jg4Pjgq/jgYznqbrjgYvvvJ8KaW50IGlzRW1wdHkoU3RhY2sgKnMpIHsgcmV0dXJuIHMtPnRvcCA9PSBOVUxMOyB9CgovLyDjg53jg4Pjg5cKaW50IHBvcChTdGFjayAqcywgY2hhciAqcG9wcGVkRGF0YSkgewogIGlmIChpc0VtcHR5KHMpKSB7CiAgICByZXR1cm4gLTE7CiAgfQogIE5vZGUgKnBvcHBlZE5vZGUgPSBzLT50b3A7CiAgKnBvcHBlZERhdGEgPSBwb3BwZWROb2RlLT5kYXRhOwogIHMtPnRvcCA9IHBvcHBlZE5vZGUtPm5leHQ7CiAgZnJlZShwb3BwZWROb2RlKTsKICByZXR1cm4gMDsKfQoKLy8g44OU44O844KvCmludCBwZWVrKFN0YWNrICpzLCBjaGFyICp0b3BEYXRhKSB7CiAgaWYgKGlzRW1wdHkocykpIHsKICAgIHJldHVybiAtMTsKICB9CiAgKnRvcERhdGEgPSBzLT50b3AtPmRhdGE7CiAgcmV0dXJuIDA7Cn0KCi8vIOOCueOCv+ODg+OCr+OBruWGheWuueOCkuihqOekugp2b2lkIHByaW50U3RhY2soU3RhY2sgKnMpIHsKICBOb2RlICpjdXJyZW50ID0gcy0+dG9wOwogIHdoaWxlIChjdXJyZW50ICE9IE5VTEwpIHsKICAgIHByaW50ZigiJWQgIiwgY3VycmVudC0+ZGF0YSk7CiAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKICB9CiAgcHJpbnRmKCJcbiIpOwp9CgovLyDjg6Hjg6Ljg6rjga7op6PmlL4Kdm9pZCBmcmVlU3RhY2soU3RhY2sgKnMpIHsKICBOb2RlICpjdXJyZW50ID0gcy0+dG9wOwogIHdoaWxlIChjdXJyZW50ICE9IE5VTEwpIHsKICAgIE5vZGUgKnRtcCA9IGN1cnJlbnQ7CiAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKICAgIGZyZWUodG1wKTsKICB9CiAgcy0+dG9wID0gTlVMTDsKfQoKaW50IGNoZWNrUGFyZW50aGVzZXMoY2hhciBzdHJbXSkgewogU3RhY2sgczsKIGluaXRTdGFjaygmcyk7CiBpbnQgcmVzdWx0ID0gMTsKIAogZm9yIChpbnQgaSA9IDA7IHN0cltpXSAhPSAnXDAnOyBpKyspIHsKICBjaGFyIGMgPSBzdHJbaV07CiAgaWYgKGMgPT0gJygnIHx8IGMgPT0gJ1snKSB7CiAgCWlmIChwdXNoKCZzLCBjKSAhPSAwKSB7CiAgCXJlc3VsdCA9IDA7CiAgCWJyZWFrOwogIH0KIH1lbHNlIGlmIChjID09ICcpJyB8fCBjID09ICddJykgewogIGNoYXIgcG9wcGVkOwogIGlmIChpc0VtcHR5KCZzKSkgewogICByZXN1bHQgPSAwOwogICBicmVhazsKfQogICAgICAgICAgICAKIHBvcCgmcywgJnBvcHBlZCk7CiAgaWYgKCEoKGMgPT0gJyknICYmIHBvcHBlZCA9PSAnKCcpIHx8IChjID09ICddJyAmJiBwb3BwZWQgPT0gJ1snKSkpIHsKICAgcmVzdWx0ID0gMDsKICAgYnJlYWs7CiAgIH0KICB9CiB9CgogaWYgKHJlc3VsdCA9PSAxICYmICFpc0VtcHR5KCZzKSkgewogIHJlc3VsdCA9IDA7Cn0KCiBmcmVlU3RhY2soJnMpOyAvLyDjgrnjgr/jg4Pjgq/jga7jg6Hjg6Ljg6rjgpLop6PmlL4KIHJldHVybiByZXN1bHQ7Cn0KCmludCBtYWluKHZvaWQpIHsKIGNoYXIgc3RyMVtdID0gIihhW2IoYyldKSI7CiBjaGFyIHN0cjJbXSA9ICIoWyldIjsKIGNoYXIgc3RyM1tdID0gIihbKCldIjsKIAogcHJpbnRmKCIlcyDjga7jg4Hjgqfjg4Pjgq/ntZDmnpw6ICVkXG4iLCBzdHIxLCBjaGVja1BhcmVudGhlc2VzKHN0cjEpKTsKIHByaW50ZigiJXMg44Gu44OB44Kn44OD44Kv57WQ5p6cOiAlZFxuIiwgc3RyMiwgY2hlY2tQYXJlbnRoZXNlcyhzdHIyKSk7CiBwcmludGYoIiVzIOOBruODgeOCp+ODg+OCr+e1kOaenDogJWRcbiIsIHN0cjMsIGNoZWNrUGFyZW50aGVzZXMoc3RyMykpOwogcmV0dXJuIDA7Cn0=