我有一个带括号的字符串(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);
}
但是对于第二个问题,我不太清楚这个问题。如果我的字符串是“(()”,那么位置是第二个括号的位置吗?如果我的字符串是“(()(”),则偏离的括号的位置是什么?
感谢您的帮助
答案 0 :(得分:1)
毫无疑问,有很多方法可以解决此问题,但是由于缺乏其他要求,我将计算从左向右扫描的嵌套级别。如果计数小于零,请指向该符号作为原因。
如果字符串的结尾到来并且级别不为零,则(可能)指向该位置作为不完整的表达式。
答案 1 :(得分:0)
通过使用Stack作为括号余额检查的实现,解决方案应为:
首先,假设索引从0开始。Stack.top = -1(指示在堆栈中未插入括号)。我们将算法从第一个左括号(索引0)到最后一个括号运行。 fault_index = -1(用于打印哪个括号有问题)
如果遇到'('->插入堆栈。Stack.top + = 1且fault_index =该括号在给定字符串中的索引(仅在插入此括号之前Stack为空时才必须设置ault_index)
如果遇到')'->从堆栈中删除'('。Stack.top-= 1。
在以下任何一种情况发生时我们都会停止,并且必须采取相应的措施:
当字符串为空时:
a。如果堆栈为空->字符串括号是平衡的。
b。如果堆栈不为空-> Fault at fault_index
当您遇到一个额外的')'时,即当堆栈为空并得到此括号时,此索引为fault_index。
答案 2 :(得分:0)
感谢您的回答。使用计数器不是一个坏主意,但是在这种情况下它可以起作用“(()”,而在这种情况下不能起作用“((()(......:(