【问题标题】:well balanced and correctly written expression平衡和正确的表达
【发布时间】:2019-08-22 02:50:46
【问题描述】:

我有一个带括号的字符串 (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);

} 

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

谢谢你的帮助

【问题讨论】:

  • 对于"(()(",它与问题的答案相同,即寻找偏离规则的第一个括号的位置。
  • @ChetanRanpariya 如果我的字符串是“(()(”),请问括号的位置是什么,谢谢
  • 如果你对作业的意义有疑问,你应该问你的教授或助教。我们也不知道它们是什么意思。
  • "(()("第一个偏括号的位置是1
  • @ChetanRanpariya 我认为是 4,最后一个括号!

标签: c algorithm stack


【解决方案1】:

毫无疑问,有很多方法可以解决这个问题,但由于缺乏额外的要求,我会计算从左到右扫描的嵌套级别。如果计数小于零,请指出该符号作为原因。

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

【讨论】:

  • 假设字符串是“((asd)asd”。冒犯的(是第二个字符。如果他按照你的建议去做,他怎么知道?
  • @DavidSchwartz:我会说在这种情况下,有问题的(first 字符,因为那是不匹配的字符。第二个字符与第 6 个字符匹配...
  • @DavidSchwartz 是的,“((asd)asd”是第二个括号,但是如何实现呢?
  • 最后,如果计数不为零,则返回字符串中第一个括号(的索引),因为那是第一个不平衡的(后面可能有更多不平衡的那个,但是第一个是不平衡的。
  • @ChrisDodd 请问哪个算? "如果计数不为零"
【解决方案2】:

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

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

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

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

当任何一种情况发生时我们都会停下来,必须采取相应的行动:

  1. 当字符串为空时:

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

    b.如果堆栈不为空 -> 故障位于 fault_index

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

【讨论】:

  • @Constellation,对于您给定的输入“(()”,代码将如何执行:最初 Stack.top = -1 和 fault_index = -1 遇到(-> Stack.top = 0 和由于堆栈为空,fault_index = 0(字符串中字符的索引。)。推送(到堆栈另一个(-> Stack.top = 1,fault_Index 未更新为堆栈不为空。推送到堆栈。遇到)-> 堆栈。 top 从 1 减少到 0。fault_index 仍然是 0。因为字符串是空的 -> 并且堆栈不是空的。故障在 fault_index = 0 处。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2013-04-12
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2010-10-07
    相关资源
    最近更新 更多