以下代码使用堆栈标识平衡括号有什么问题?

时间:2016-05-30 05:02:28

标签: c++ stl stack

问题:

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

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

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

输入格式:

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

*每个测试用例由一行括号括起来。

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;
}

这是用于检查平衡括号的代码。它的工作正常,字符串以&#39; {&#39;但失败了像&#34; []&#34;

这样的字符串

1 个答案:

答案 0 :(得分:1)

您必须收到分段错误。

假设,

s = "[]";

第一次迭代后,您的堆栈仅包含&#34; [&#34;。

在第二次迭代中,

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

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

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

in

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

这就是问题所在。所以在致电

之前
stk.top();

确保您的堆栈不为空。

检查平衡括号的this教程。