lsmCC 发表于 2023-11-8 10:34:10

为什么我写的括号匹配不对呢

#include <bits/stdc++.h>
using namespace std;
int main()
{
    char c;
    stack<char> s;
    while(cin>>c&&c!='@')
    {
      if(c=='(')
      {
            s.push(c);
      }
      if(c==')')
      {
            if(!s.empty())
            {
                s.pop();
            }
            else
            {
                cout<<"N0"<<endl;
                return 0;
            }
      }


    }
    if(s.empty())cout<<"YES";
    cout<<"NO";
}

Mike_python小 发表于 2023-11-8 10:35:02

关于括号匹配问题

你的代码几乎正确,但有一个小问题导致了输出不符合预期。在判断完括号匹配后,需要根据情况输出"YES"或者"NO",但是当前的代码在输出"YES"后并没有终止程序运行。我会帮你修改一下代码:


#include <bits/stdc++.h>
using namespace std;

int main() {
    char c;
    stack<char> s;

    while(cin >> c && c != '@') {
      if (c == '(') {
            s.push(c);
      }
      else if (c == ')') {
            if (!s.empty()) {
                s.pop();
            }
            else {
                cout << "NO" << endl;// 如果遇到多余的右括号,直接输出"NO"
                return 0;
            }
      }
    }

    if (s.empty()) {
      cout << "YES" << endl;// 如果栈为空,说明括号匹配成功,输出"YES"
    } else {
      cout << "NO" << endl;// 否则输出"NO"
    }

    return 0;
}


这样修改后,当括号匹配成功时会输出"YES"并终止程序运行,当括号匹配不成功时会输出"NO"并终止程序运行。希望这次能够满足你的需求,如果还有其他问题,欢迎继续提问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-11-8 10:35:21

在你的代码中,括号匹配不正确的原因是你没有正确处理所有可能的情况。具体来说,你只检查了右括号,但没有检查左括号是否匹配。因此,即使你的栈为空,也不能保证括号匹配是正确的。

要解决这个问题,你可以使用一个计数器来跟踪左括号的数量。当遇到左括号时,将计数器加1;当遇到右括号时,将计数器减1。如果在遍历完所有字符后,计数器的值为0,则括号匹配是正确的。

下面是修改后的代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    char c;
    stack<char> s;
    int count = 0; // 添加计数器
    while(cin >> c && c != '@')
    {
      if(c == '(')
      {
            s.push(c);
            count++; // 左括号数量加1
      }
      if(c == ')')
      {
            if(!s.empty())
            {
                s.pop();
                count--; // 右括号匹配成功,左括号数量减1
            }
            else
            {
                cout << "NO" << endl;
                return 0;
            }
      }
    }
    if(count == 0 && s.empty()) // 判断左括号数量是否为0且栈为空
      cout << "YES" << endl;
    else
      cout << "NO" << endl;
}


现在,你的代码将正确地检查括号匹配。如果括号匹配正确,它将输出"YES";否则,它将输出"NO"。
页: [1]
查看完整版本: 为什么我写的括号匹配不对呢