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

What is wrong with the following code to identify balanced parentheses using stack?

本文关键字:什么 问题 平衡 标识 代码 堆栈      更新时间:2023-10-16

问题:

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

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

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

输入格式:

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

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

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

它是用于检查平衡括号的代码。它对以"{"开头的字符串工作正常,但对"[]"等字符串失败

您一定是遇到了分段错误。

假设

s = "[]";

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

在第二次迭代期间,

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

上面的代码使您的堆栈为空。在下一行中,您要呼叫

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

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

这就是问题所在。所以在打电话之前

stk.top();

确保您的堆栈不为空。

查看有关平衡括号的本教程。