搜索匹配的括号

问题描述 投票:1回答:3

所以我的背景不是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,所以我将编程作为一种爱好。无论如何,我都需要解决这个问题:给定像“([]]”这样的表达式,请检查该表达式是否具有匹配的括号样式,即...

c arrays string loops parentheses
3个回答
4
投票

<可以正确地执行此操作,而无需以一种或另一种形式堆叠。您执行此操作的方式无法正确处理嵌套。例如,它将错误地接受“ [[]]”


1
投票
解决方案遇到的问题是,您需要记住遇到括号和方括号的顺序。我建议您只有一个计数器,当您遇到[(时递增,而当您遇到])时递减,并且有一个数组来记录当计数为零时遇到的括号类型。

0
投票
正如已经回答的那样,您需要一个堆栈以便能够匹配括号本身。想法是在左括号插入时插入括号(如果您得到[则将其推入,或者如果遇到左(则将其推入)当您找到右]或[C0 ],然后在堆栈的弹出窗口中弹出该字符,并查看它是否与您遇到的字符相同...如果它们是相同类型,则它们匹配,然后将它们都扔掉,然后进行下一个操作。如果在某个时候您尝试从堆栈中弹出并且堆栈为空,或者您到达输入的末尾并且堆栈中仍然有一些内容...则您的括号不平衡,并且您犯了一个错误。让我们用以下输入检查该算法:
© www.soinside.com 2019 - 2024. All rights reserved.