【问题标题】:What is wrong with the following code to identify balanced parentheses using stack?以下代码使用堆栈识别平衡括号有什么问题?
【发布时间】:2016-05-30 05:02:28
【问题描述】:

问题:

给定一个由括号组成的序列,判断表达式是否平衡。如果每个开括号都可以唯一地与出现在前者之后的闭括号配对,则括号序列是平衡的。此外,它们之间的间隔必须平衡。您将获得三种类型的括号:(、{ 和 [.

{[()]} - 这是一个平衡括号。

{[(])} - 这不是平衡括号。

输入格式:

*输入的第一行包含测试用例的数量。

*每个测试用例由一行括号组成。

stack <char> stk;
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */   
int n;

cin>>n;

for(int i=0;i<n;i++)
{
    string s;
    cin>>s;cout<<s;
    int j=0;
    while(j!=s.length())
    {
        if(stk.size()==0&&(s[j]==')'||s[j]==']'||s[j]=='}'))
        {stk.push('z');}
        if(s[j]=='('||s[j]=='['||s[j]=='{')
            stk.push(s[j]);
        if(stk.top()=='('&&s[j]==')')
            stk.pop();
        if(stk.top()=='['&&s[j]==']')
            stk.pop();
        if(stk.top()=='{'&&s[j]=='}')
            stk.pop();   
        j++;
    }
    if(stk.size()==0)
        cout<<"YES"<<endl;
    else
    {
        cout<<"NO"<<endl;
        while(stk.size()!=0)
            stk.pop();
    }
}
return 0;
}

这是一个检查平衡括号的代码。它适用于以“{”开头的字符串,但使用“[]”之类的字符串失败

【问题讨论】:

  • 您可以将布尔值 invalid 设置为 true 并在循环之外执行 break; 而不是 stk.push('z')
  • 这里有一个线索:尝试交换:if(stk.top()=='['&amp;&amp;s[j]==']')if(stk.top()=='{'&amp;&amp;s[j]=='}'),看看情况如何变化。
  • PS:这个问题可以通过使用短路布尔求值轻松解决。
  • @Cheersandhth.-Alf,这并不能真正帮助解决问题。谢谢
  • @CraigYoung,那个人做到了。谢谢!

标签: c++ stl stack


【解决方案1】:

您一定遇到了分段错误。

假设,

s = "[]";

第一次迭代后,您的堆栈仅包含“[”。

在第二次迭代中,

if(stk.top()=='['&&s[j]==']')
        stk.pop();

上面的代码使你的堆栈为空。 在下一行你正在调用

stk.top() // But your stack is empty

if(stk.top()=='{'&&s[j]=='}')
        stk.pop();

这就是问题所在。所以在调用之前

stk.top();

确保您的堆栈不为空。

查看this关于平衡括号的教程。

【讨论】:

  • 这真的很有帮助。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2016-09-06
  • 2016-06-26
  • 2021-01-14
相关资源
最近更新 更多