通过栈来处理字符。创建一个char类型的栈。将传入的字符串s进行逐字节遍历,因为情景条件固定三种,所以使用switch语句。如果是{}、()、[]中的左括号就通过push()入栈。如果是右括号,就进行比较。1)如果为此时空栈empty(),说明没有与右括号匹配的左括号,右括号个数多于左括号个数,一定不会匹配成功,此时直接返回false。2)如果不是空栈,取出栈顶元素与当前右括号匹配。如果成功匹配,就让栈顶元素弹出pop(),否则没有成功匹配返回失败false。最后switch语句执行完毕,所有的左括号已全部入栈,所有的右括号无论成败都已全部匹配完毕。若此时栈内仍有元素,即不为空栈,说明左括号过多,直接返回false。如果前面的逻辑都执行完毕,没有返回失败,说明此时所有括号均已匹配成功,可以返回true。
你程序没有考虑当符号为')'而栈为空的情况,此时你用s.pop()栈溢出了,程序出错在循环中加 if (a[i]==')' && s.empty()) { printf("No"); //若栈为空而符号是‘)'直接退出 ,且结果为No return 0; }//其实就个题目不严谨//若表达式是 ")("它算是Yes还是No,
原因是如果右括号多,此时s是空的,无法再放走一个元素。方法很简单,用一个变量就行了。#include<bits/stdc++.h>using namespace std;char a[256];int s=0;int main(){int i;gets(a);for(i=0;i<strlen(a);i++){if(a[i]=='(')s++;else if(a[i]==')')s--;}if(s==0)printf("Yes");elseprintf("No");return 0;}
3 个回答
笑颜如花
赞同来自 :
通过栈来处理字符。
创建一个char类型的栈。
将传入的字符串s进行逐字节遍历,因为情景条件固定三种,所以使用switch语句。
如果是{}、()、[]中的左括号就通过push()入栈。
如果是右括号,就进行比较。
1)如果为此时空栈empty(),说明没有与右括号匹配的左括号,右括号个数多于左括号个数,一定不会匹配成功,此时直接返回false。
2)如果不是空栈,取出栈顶元素与当前右括号匹配。
如果成功匹配,就让栈顶元素弹出pop(),否则没有成功匹配返回失败false。
最后switch语句执行完毕,所有的左括号已全部入栈,所有的右括号无论成败都已全部匹配完毕。若此时栈内仍有元素,即不为空栈,说明左括号过多,直接返回false。
如果前面的逻辑都执行完毕,没有返回失败,说明此时所有括号均已匹配成功,可以返回true。
勿忘心安
赞同来自 :
你程序没有考虑当符号为')'而栈为空的情况,此时你用s.pop()栈溢出了,程序出错
在循环中加
if (a[i]==')' && s.empty())
{
printf("No"); //若栈为空而符号是‘)'直接退出 ,且结果为No
return 0;
}
//其实就个题目不严谨
//若表达式是 ")("它算是Yes还是No,
酷并且帅
赞同来自 :
原因是如果右括号多,此时s是空的,无法再放走一个元素。方法很简单,用一个变量就行了。
#include<bits/stdc++.h>
using namespace std;
char a[256];
int s=0;
int main()
{
int i;
gets(a);
for(i=0;i<strlen(a);i++)
{
if(a[i]=='(')
s++;
else if(a[i]==')')
s--;
}
if(s==0)
printf("Yes");
else
printf("No");
return 0;
}
提问者
千山万水有没有, 我心只有一个梦,这是我对你的呼唤哦。
威望
粉丝
感谢
积分
赞同
提问
文章
回复
私信 问Ta
关注问题人数 4 人
相关问题