鱼C论坛

 找回密码
 立即注册
查看: 839|回复: 2

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

[复制链接]
发表于 2023-11-8 10:34:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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";
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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"并终止程序运行。希望这次能够满足你的需求,如果还有其他问题,欢迎继续提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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"。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-15 10:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表