为什么提交会出现部分错误
设计一个算法,判断一个含有()、[]、{}三种类型括号的表达式中所有括号是否匹配。输入格式:
输入一行字符串,如:(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
倒数第十九行的 '}' 改成 '{'
还是错的 本帖最后由 ExiaGN001 于 2023-3-12 18:56 编辑
给一下评测地址,这边改完了,希望测一下
本帖最后由 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;
}
思路
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 ExiaGN001 发表于 2023-3-12 18:53
给一下评测地址,这边改完了,希望测一下
你进不去 傻眼貓咪 发表于 2023-3-12 18:59
等晚点我试试 giegie666 发表于 2023-3-12 19:01
等晚点我试试
(a++d)这只是一个测试用例,改成别的你这代码就是错的 giegie666 发表于 2023-3-12 20:43
(a++d)这只是一个测试用例,改成别的你这代码就是错的
别的有例子吗? 傻眼貓咪 发表于 2023-3-12 20:46
别的有例子吗?
输入格式:
输入一行字符串,如:(a++d)
改成:(a++d}输出的结果还是true giegie666 发表于 2023-3-12 20:49
输入格式:
输入一行字符串,如:(a++d)
改成:(a++d}输出的结果还是true
我测试了,我输出是 false, 完全没有问题 {:10_291:} {:10_291:} {:10_291:} giegie666 发表于 2023-3-12 20:49
输入格式:
输入一行字符串,如:(a++d)
改成:(a++d}输出的结果还是true
你是在这里改的cout << boolalpha << isValid("(a++d)");
(a++d) 改成(a++d}吗 giegie666 发表于 2023-3-12 19:00
你进不去
不试试怎么知道呢?
链接发一下
如果是主流OJ都能进的 ExiaGN001 发表于 2023-3-13 21:20
不试试怎么知道呢?
链接发一下
你发给我吧,我试试 ExiaGN001 发表于 2023-3-12 18:56
这个还是通不过 还有人帮帮忙吗 ExiaGN001 发表于 2023-3-13 21:20
不试试怎么知道呢?
链接发一下
如果是主流OJ都能进的
有种情况,如果没有括号,也会输出匹配,是不是这个问题 giegie666 发表于 2023-3-13 23:51
有种情况,如果没有括号,也会输出匹配,是不是这个问题
没括号本来就该匹配啊( ExiaGN001 发表于 2023-3-15 06:52
没括号本来就该匹配啊(
这题改了应该是没括号就不匹配,有的题是匹配
页:
[1]
2