鱼C论坛

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

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

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

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

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

x
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5.     char c;
  6.     stack<char> s;
  7.     while(cin>>c&&c!='@')
  8.     {
  9.         if(c=='(')
  10.         {
  11.             s.push(c);
  12.         }
  13.         if(c==')')
  14.         {
  15.             if(!s.empty())
  16.             {
  17.                 s.pop();
  18.             }
  19.             else
  20.             {
  21.                 cout<<"N0"<<endl;
  22.                 return 0;
  23.             }
  24.         }


  25.     }
  26.     if(s.empty())cout<<"YES";
  27.     cout<<"NO";
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-11-8 10:35:02 | 显示全部楼层
关于括号匹配问题

你的代码几乎正确,但有一个小问题导致了输出不符合预期。在判断完括号匹配后,需要根据情况输出"YES"或者"NO",但是当前的代码在输出"YES"后并没有终止程序运行。我会帮你修改一下代码:
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main() {
  4.     char c;
  5.     stack<char> s;
  6.     while(cin >> c && c != '@') {
  7.         if (c == '(') {
  8.             s.push(c);
  9.         }
  10.         else if (c == ')') {
  11.             if (!s.empty()) {
  12.                 s.pop();
  13.             }
  14.             else {
  15.                 cout << "NO" << endl;  // 如果遇到多余的右括号,直接输出"NO"
  16.                 return 0;
  17.             }
  18.         }
  19.     }
  20.     if (s.empty()) {
  21.       cout << "YES" << endl;  // 如果栈为空,说明括号匹配成功,输出"YES"
  22.     } else {
  23.       cout << "NO" << endl;  // 否则输出"NO"
  24.     }
  25.     return 0;
  26. }
复制代码

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

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-8 10:35:21 | 显示全部楼层
在你的代码中,括号匹配不正确的原因是你没有正确处理所有可能的情况。具体来说,你只检查了右括号,但没有检查左括号是否匹配。因此,即使你的栈为空,也不能保证括号匹配是正确的。

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

下面是修改后的代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5.     char c;
  6.     stack<char> s;
  7.     int count = 0; // 添加计数器
  8.     while(cin >> c && c != '@')
  9.     {
  10.         if(c == '(')
  11.         {
  12.             s.push(c);
  13.             count++; // 左括号数量加1
  14.         }
  15.         if(c == ')')
  16.         {
  17.             if(!s.empty())
  18.             {
  19.                 s.pop();
  20.                 count--; // 右括号匹配成功,左括号数量减1
  21.             }
  22.             else
  23.             {
  24.                 cout << "NO" << endl;
  25.                 return 0;
  26.             }
  27.         }
  28.     }
  29.     if(count == 0 && s.empty()) // 判断左括号数量是否为0且栈为空
  30.         cout << "YES" << endl;
  31.     else
  32.         cout << "NO" << endl;
  33. }
复制代码


现在,你的代码将正确地检查括号匹配。如果括号匹配正确,它将输出"YES";否则,它将输出"NO"。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-21 15:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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