Так что мой опыт не CS, и я воспринял программирование как хобби. В любом случае мне нужно решить эту проблему: учитывая выражение типа "([])", проверьте, имеет ли это выражение соответствующий стиль скобок, то есть соответствие "[" и соответствие "(".
. Я понимаю, что Есть решения для этого, но они имеют дело со стеком, и я не узнал об этом. Поэтому я попробовал свой собственный, который выглядит очень спагетти, но это работает.
/* Program to check if parens are balanced */
#include <stdio.h>
#include <string.h>
int main(){
char expr[100] = "[)";
int roundcounter = 0, squarecounter = 0, i = 0;
while (expr[i] != '\0') {
if (expr[i] == '(') {
roundcounter++;
}
else if (expr[i] == ')') {
roundcounter--;
if (roundcounter < 0) {
break;
}
}
if (expr[i] == '[') {
squarecounter++;
}
else if (expr[i] == ']') {
squarecounter--;
if (squarecounter < 0) {
break;
}
}
i++;
}
if (roundcounter == 0 && squarecounter == 0) {
printf("Balanced parenthesis !\n");
}
else {
printf("Unbalaced !\n");
/* Error for [ ] */
if (squarecounter > 0) {
printf("Missing right square bracket\n");
}
else if (squarecounter < 0) {
printf("Missing left square bracket\n");
}
/* Error for ( ) */
if (roundcounter > 0) {
printf("Missing right round bracket\n");
}
else if (roundcounter < 0) {
printf("Missing left round bracket\n");
}
}
return 0;
}
В основном, есть два счетчика и каждый ответственный для сравнения () и [] и увеличения (+1), если слева, или уменьшения (-1), если справа. Если счетчики = 0, то у нас есть выражение баланса.
Есть ли лучший способ сделать это «Я думал о создании массива закрытых и открытых символов:
char openarr[] = {'[', '('};
char closenarr[] = {']', ')'};
Но тогда я не уверен, как поступить. Я могу l oop через openarr и сказать, совпадает ли expr [i] с openarr затем увеличьте счетчик и сделайте то же самое для closearr.
Однако нам все еще нужно более 1 счетчика из-за следующего случая. Скажем, у нас есть expr = "[)" и только 1 счетчик, скажем, x.
For loop for openarr will pass because: expr[i] has [ element, counter = 1
For loop for closearr will pass because: expr[i] has ) element, counter = 0
Это, конечно, не так для expr = "[)"
Пожалуйста, дайте мне знать, как это улучшить.