平衡良好且表达正确

时间:2019-04-01 00:15:36

标签: c algorithm stack

我有一个带括号的字符串(char * ch),我必须:

1)验证字符串是否正确书写并保持平衡,例如:“(())”正确书写并保持平衡,而“)()”书写不正确也不平衡

2)如果字符串写得不好并且没有很好地平衡,则返回偏离此规则的第一个括号的位置。

第一个问题,可以。我的代码如下:

int WBalanced(char *ch)
{
    stack p; int i;

 for (i=0; i<strlen(ch);i++) 
  {

    if(ch[i] == '(')
    {
        addStack(P, ch[i]);
    else if(ch[i] == ')') 
      {
        if(stackEmpty(P) == 0) 
            unstack(P);
        else
            return (0);
       }
     }
   }



 if(stackEmpty(P)==1) 
    return (0);
 else
    return (1);

} 

但是对于第二个问题,我不太清楚这个问题。如果我的字符串是“(()”,那么位置是第二个括号的位置吗?如果我的字符串是“(()(”),则偏离的括号的位置是什么?

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

毫无疑问,有很多方法可以解决此问题,但是由于缺乏其他要求,我将计算从左向右扫描的嵌套级别。如果计数小于零,请指向该符号作为原因。

如果字符串的结尾到来并且级别不为零,则(可能)指向该位置作为不完整的表达式。

答案 1 :(得分:0)

通过使用Stack作为括号余额检查的实现,解决方案应为:

首先,假设索引从0开始。Stack.top = -1(指示在堆栈中未插入括号)。我们将算法从第一个左括号(索引0)到最后一个括号运行。 fault_index = -1(用于打印哪个括号有问题)

  1. 如果遇到'('->插入堆栈。Stack.top + = 1且fault_index =该括号在给定字符串中的索引(仅在插入此括号之前Stack为空时才必须设置ault_index)

  2. 如果遇到')'->从堆栈中删除'('。Stack.top-= 1。

在以下任何一种情况发生时我们都会停止,并且必须采取相应的措施:

  1. 当字符串为空时:

    a。如果堆栈为空->字符串括号是平衡的。

    b。如果堆栈不为空-> Fault at fault_index

  2. 当您遇到一个额外的')'时,即当堆栈为空并得到此括号时,此索引为fault_index。

答案 2 :(得分:0)

感谢您的回答。使用计数器不是一个坏主意,但是在这种情况下它可以起作用“(()”,而在这种情况下不能起作用“((()(......:(