所以我的背景不是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)。如果counters = 0,那么我们有余额表达式。
有更好的方法吗?我正在考虑创建一个封闭和开放的字符数组:
char openarr[] = {'[', '('}; char closenarr[] = {']', ')'};
但是我不确定如何继续。我可以遍历openarr,说expr [i]是否匹配openarr,然后增加counter,对closearr执行相同的操作。
但是,由于以下情况,我们仍然需要多个计数器。假设我们有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 =“ [)”肯定不是这种情况>
[请让我知道如何改善这一点。
所以我的背景不是CS,所以我将编程作为一种爱好。无论如何,我都需要解决这个问题:给定像“([]]”这样的表达式,请检查该表达式是否具有匹配的括号样式,即...
<可以正确地执行此操作,而无需以一种或另一种形式堆叠。您执行此操作的方式无法正确处理嵌套。例如,它将错误地接受“ [[]]”
[
或(
时递增,而当您遇到]
或)
时递减,并且有一个数组来记录当计数为零时遇到的括号类型。 [
则将其推入,或者如果遇到左(
则将其推入)当您找到右]
或[C0 ],然后在堆栈的弹出窗口中弹出该字符,并查看它是否与您遇到的字符相同...如果它们是相同类型,则它们匹配,然后将它们都扔掉,然后进行下一个操作。如果在某个时候您尝试从堆栈中弹出并且堆栈为空,或者您到达输入的末尾并且堆栈中仍然有一些内容...则您的括号不平衡,并且您犯了一个错误。让我们用以下输入检查该算法: