为什么我写的括号匹配不对呢
#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";
} 关于括号匹配问题
你的代码几乎正确,但有一个小问题导致了输出不符合预期。在判断完括号匹配后,需要根据情况输出"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"并终止程序运行。希望这次能够满足你的需求,如果还有其他问题,欢迎继续提问。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:} 在你的代码中,括号匹配不正确的原因是你没有正确处理所有可能的情况。具体来说,你只检查了右括号,但没有检查左括号是否匹配。因此,即使你的栈为空,也不能保证括号匹配是正确的。
要解决这个问题,你可以使用一个计数器来跟踪左括号的数量。当遇到左括号时,将计数器加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"。
页:
[1]