鱼C论坛

 找回密码
 立即注册
查看: 2516|回复: 21

为什么提交会出现部分错误

[复制链接]
发表于 2023-3-12 16:26:41 | 显示全部楼层 |阅读模式

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

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

x
设计一个算法,判断一个含有()、[]、{}三种类型括号的表达式中所有括号是否匹配。

输入格式:
输入一行字符串,如:(a+[b-c]+d)

输出格式:
如果括号匹配,输出“匹配", 否则输出"不匹配"








#include<bits/stdc++.h>
using namespace std;
string s,a;
int top=0;
int main()
{
        int n,i,j,flag=0;
        cin>>a;
        n=a.length();
        for(i=0;i<n;++i)
        {
                if(a[i]=='(' || a[i]=='['|| a[i]=='{')
                    s[++top]=a[i];
                else
                  if(a[i]==')')
                  {
                          if(top==0 || s[top--]!='(')
                        {
                                flag=1;
                                break;
                        }
                  }
                  else
                    if(a[i]==']')
                    {
                            if(top==0 || s[top--]!='[')
                            {
                                    flag=1;
                                    break;
                                }
                        }
         else
                    if(a[i]=='}')
                    {
                            if(top==0 || s[top--]!='}')
                            {
                                    flag=1;
                                    break;
                                }
                        }
        }
        if(top>0)
            flag=1;
        if(flag==1)
        {
                cout<<"不匹配";
        }
        else
        {
                cout<<"匹配";
        }
        return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-3-12 17:08:26 | 显示全部楼层
倒数第十九行的 '}' 改成 '{'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-12 17:52:44 From FishC Mobile | 显示全部楼层
tommyyu 发表于 2023-3-12 17:08
倒数第十九行的 '}' 改成 '{'

还是错的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-12 18:53:11 | 显示全部楼层
本帖最后由 ExiaGN001 于 2023-3-12 18:56 编辑

给一下评测地址,这边改完了,希望测一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-12 18:56:13 | 显示全部楼层
本帖最后由 ExiaGN001 于 2023-3-18 19:33 编辑

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. //string s,a;
  4. string a;
  5. stack<char> s;
  6. int main()
  7. {
  8.         int n,i,j,flag=0;
  9.         int flg_br=0;
  10.         cin>>a;
  11.         n=a.length();
  12.         for(i=0;i<n;++i)
  13.         {
  14.                 if(a[i]=='(' || a[i]=='['|| a[i]=='{')
  15.                         {s.push(a[i]);flg_br=1;}
  16.                 if(a[i]==')')
  17.                 {
  18.                         if(s.empty()==1||s.top()!='(')
  19.                         {
  20.                                 flag=1;break;
  21.                         }
  22.                         else s.pop();
  23.                 }
  24.                 if(a[i]==']')
  25.                 {
  26.                         if(s.empty()==1||s.top()!='[')
  27.                         {
  28.                                 flag=1;break;
  29.                         }
  30.                         else s.pop();
  31.                 }
  32.                 if(a[i]=='}')
  33.                 {
  34.                         if(s.empty()==1||s.top()!='{')
  35.                         {
  36.                                 flag=1;break;
  37.                         }
  38.                         else s.pop();
  39.                 }
  40.         }
  41.         if(!s.empty())
  42.                 flag=1;
  43.         if(flag==1||flg_br==0)
  44.         {
  45.                 cout<<"不匹配";
  46.         }
  47.         else
  48.         {
  49.                 cout<<"匹配";
  50.         }
  51.         return 0;
  52. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-12 18:59:47 | 显示全部楼层
  1. 思路
  2. 1. 从左到右遍历字符串
  3. 2. 如果不是括号,默认是有效字符,遍历下一个字符
  4. 3. 如果是左括号,左括号进入栈,遍历下一个字符
  5. 4. 如果是右括号 当前栈是否还有左括号 没有则匹配失败 ...
  6. 5. 如果出栈的字符和当前字符匹配为一对括号,遍历下一个
  7. 6.不匹配,则匹配失败
  8. 7. 遍历完毕后,判断栈中是否还有剩余左括号 没有,匹配成功
复制代码
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. using namespace std;

  5. map <char, char> bracket = { {'(', ')'}, {'{', '}'}, {'[', ']'} };

  6. bool isValid(string str) {
  7.         vector <char> stack;
  8.         for (auto c: str) {
  9.                 if (c == '(' or c == '{' or c == '[') stack.push_back(c);
  10.                 else if (c == ')' or c == '}' or c == ']') {
  11.                         if (bracket.size()) {
  12.                                 if (bracket[stack.back()] != c) return false;
  13.                                 else stack.pop_back();
  14.                         }
  15.                         else return false;
  16.                 }
  17.         }
  18.         return not stack.size();
  19. }

  20. int main(void) {
  21.         cout << boolalpha << isValid("(a+[b-c]+d)");
  22.         return 0;
  23. }
复制代码
  1. true
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-3-12 19:00:12 From FishC Mobile | 显示全部楼层
ExiaGN001 发表于 2023-3-12 18:53
给一下评测地址,这边改完了,希望测一下

你进不去
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-12 19:01:48 From FishC Mobile | 显示全部楼层
傻眼貓咪 发表于 2023-3-12 18:59

等晚点我试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-12 20:43:12 From FishC Mobile | 显示全部楼层
giegie666 发表于 2023-3-12 19:01
等晚点我试试

(a+[b-c]+d)  这只是一个测试用例,改成别的你这代码就是错的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-12 20:46:06 | 显示全部楼层
giegie666 发表于 2023-3-12 20:43
(a++d)  这只是一个测试用例,改成别的你这代码就是错的

别的有例子吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-12 20:49:39 | 显示全部楼层

输入格式:
输入一行字符串,如:(a+[b-c]+d)
改成:(a+[b-c]+d}  输出的结果还是true
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-12 20:52:08 | 显示全部楼层
giegie666 发表于 2023-3-12 20:49
输入格式:
输入一行字符串,如:(a++d)
改成:(a++d}  输出的结果还是true

我测试了,我输出是 false, 完全没有问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-12 20:56:35 | 显示全部楼层
giegie666 发表于 2023-3-12 20:49
输入格式:
输入一行字符串,如:(a++d)
改成:(a++d}  输出的结果还是true

你是在这里改的cout << boolalpha << isValid("(a+[b-c]+d)");
(a+[b-c]+d) 改成(a+[b-c]+d}吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-13 21:20:25 | 显示全部楼层


不试试怎么知道呢?
链接发一下
如果是主流OJ都能进的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-13 21:21:11 From FishC Mobile | 显示全部楼层
ExiaGN001 发表于 2023-3-13 21:20
不试试怎么知道呢?
链接发一下

你发给我吧,我试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-13 23:19:32 From FishC Mobile | 显示全部楼层
ExiaGN001 发表于 2023-3-12 18:56

这个还是通不过
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-13 23:40:38 From FishC Mobile | 显示全部楼层
还有人帮帮忙吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-13 23:51:41 From FishC Mobile | 显示全部楼层
ExiaGN001 发表于 2023-3-13 21:20
不试试怎么知道呢?
链接发一下
如果是主流OJ都能进的

有种情况,如果没有括号,也会输出匹配,是不是这个问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-15 06:52:01 | 显示全部楼层
giegie666 发表于 2023-3-13 23:51
有种情况,如果没有括号,也会输出匹配,是不是这个问题

没括号本来就该匹配啊(
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-15 09:56:41 From FishC Mobile | 显示全部楼层
ExiaGN001 发表于 2023-3-15 06:52
没括号本来就该匹配啊(

这题改了应该是没括号就不匹配,有的题是匹配
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 21:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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