giegie666 发表于 2023-3-12 16:26:41

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

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

输入格式:
输入一行字符串,如:(a++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=='(' || a=='['|| a=='{')
                  s[++top]=a;
                else
                  if(a==')')
                  {
                          if(top==0 || s!='(')
                        {
                                flag=1;
                                break;
                        }
                  }
                  else
                  if(a==']')
                  {
                          if(top==0 || s!='[')
                          {
                                  flag=1;
                                  break;
                                }
                        }
         else
                  if(a=='}')
                  {
                          if(top==0 || s!='}')
                          {
                                  flag=1;
                                  break;
                                }
                        }
        }
        if(top>0)
          flag=1;
        if(flag==1)
        {
                cout<<"不匹配";
        }
        else
        {
                cout<<"匹配";
        }
        return 0;
}

tommyyu 发表于 2023-3-12 17:08:26

倒数第十九行的 '}' 改成 '{'

giegie666 发表于 2023-3-12 17:52:44

tommyyu 发表于 2023-3-12 17:08
倒数第十九行的 '}' 改成 '{'

还是错的

ExiaGN001 发表于 2023-3-12 18:53:11

本帖最后由 ExiaGN001 于 2023-3-12 18:56 编辑

给一下评测地址,这边改完了,希望测一下

ExiaGN001 发表于 2023-3-12 18:56:13

本帖最后由 ExiaGN001 于 2023-3-18 19:33 编辑


#include<bits/stdc++.h>
using namespace std;
//string s,a;
string a;
stack<char> s;
int main()
{
        int n,i,j,flag=0;
        int flg_br=0;
        cin>>a;
        n=a.length();
        for(i=0;i<n;++i)
        {
                if(a=='(' || a=='['|| a=='{')
                        {s.push(a);flg_br=1;}
                if(a==')')
                {
                        if(s.empty()==1||s.top()!='(')
                        {
                                flag=1;break;
                        }
                        else s.pop();
                }
                if(a==']')
                {
                        if(s.empty()==1||s.top()!='[')
                        {
                                flag=1;break;
                        }
                        else s.pop();
                }
                if(a=='}')
                {
                        if(s.empty()==1||s.top()!='{')
                        {
                                flag=1;break;
                        }
                        else s.pop();
                }
        }
        if(!s.empty())
                flag=1;
        if(flag==1||flg_br==0)
        {
                cout<<"不匹配";
        }
        else
        {
                cout<<"匹配";
        }
        return 0;
}

傻眼貓咪 发表于 2023-3-12 18:59:47

思路
1. 从左到右遍历字符串
2. 如果不是括号,默认是有效字符,遍历下一个字符
3. 如果是左括号,左括号进入栈,遍历下一个字符
4. 如果是右括号 当前栈是否还有左括号 没有则匹配失败 ...
5. 如果出栈的字符和当前字符匹配为一对括号,遍历下一个
6.不匹配,则匹配失败
7. 遍历完毕后,判断栈中是否还有剩余左括号 没有,匹配成功#include <iostream>
#include <vector>
#include <map>
using namespace std;

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

bool isValid(string str) {
        vector <char> stack;
        for (auto c: str) {
                if (c == '(' or c == '{' or c == '[') stack.push_back(c);
                else if (c == ')' or c == '}' or c == ']') {
                        if (bracket.size()) {
                                if (bracket != c) return false;
                                else stack.pop_back();
                        }
                        else return false;
                }
        }
        return not stack.size();
}

int main(void) {
        cout << boolalpha << isValid("(a++d)");
        return 0;
}true

giegie666 发表于 2023-3-12 19:00:12

ExiaGN001 发表于 2023-3-12 18:53
给一下评测地址,这边改完了,希望测一下

你进不去

giegie666 发表于 2023-3-12 19:01:48

傻眼貓咪 发表于 2023-3-12 18:59


等晚点我试试

giegie666 发表于 2023-3-12 20:43:12

giegie666 发表于 2023-3-12 19:01
等晚点我试试

(a++d)这只是一个测试用例,改成别的你这代码就是错的

傻眼貓咪 发表于 2023-3-12 20:46:06

giegie666 发表于 2023-3-12 20:43
(a++d)这只是一个测试用例,改成别的你这代码就是错的

别的有例子吗?

giegie666 发表于 2023-3-12 20:49:39

傻眼貓咪 发表于 2023-3-12 20:46
别的有例子吗?

输入格式:
输入一行字符串,如:(a++d)
改成:(a++d}输出的结果还是true

傻眼貓咪 发表于 2023-3-12 20:52:08

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

我测试了,我输出是 false, 完全没有问题 {:10_291:} {:10_291:} {:10_291:}

giegie666 发表于 2023-3-12 20:56:35

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

你是在这里改的cout << boolalpha << isValid("(a++d)");
(a++d) 改成(a++d}吗

ExiaGN001 发表于 2023-3-13 21:20:25

giegie666 发表于 2023-3-12 19:00
你进不去

不试试怎么知道呢?
链接发一下
如果是主流OJ都能进的

giegie666 发表于 2023-3-13 21:21:11

ExiaGN001 发表于 2023-3-13 21:20
不试试怎么知道呢?
链接发一下

你发给我吧,我试试

giegie666 发表于 2023-3-13 23:19:32

ExiaGN001 发表于 2023-3-12 18:56


这个还是通不过

giegie666 发表于 2023-3-13 23:40:38

还有人帮帮忙吗

giegie666 发表于 2023-3-13 23:51:41

ExiaGN001 发表于 2023-3-13 21:20
不试试怎么知道呢?
链接发一下
如果是主流OJ都能进的

有种情况,如果没有括号,也会输出匹配,是不是这个问题

ExiaGN001 发表于 2023-3-15 06:52:01

giegie666 发表于 2023-3-13 23:51
有种情况,如果没有括号,也会输出匹配,是不是这个问题

没括号本来就该匹配啊(

giegie666 发表于 2023-3-15 09:56:41

ExiaGN001 发表于 2023-3-15 06:52
没括号本来就该匹配啊(

这题改了应该是没括号就不匹配,有的题是匹配
页: [1] 2
查看完整版本: 为什么提交会出现部分错误