bool match(char a,char b){
if(a=='(',b==')') return true;
if(a=='{',b=='}') return true;
if(a=='[',b==']') return true;
return false;
}
void main()
// 利用stack栈判断括号是否匹配
// 输入参数:字符串序列,字符串长度
// 若匹配输出YES,否则输出NO,末尾换行
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
int q,i=0,flag=1;
scanf("%d",&q);
char *s=(char*)malloc(q*sizeof(char));
scanf("%s",s);
Stack *a;
a=Stack_Create(q); //q为长度,栈是顺序储存的栈
while(s[i]!='\0'){
switch(s[i]){
case'(':
case'{':
case'[':Stack_Push(a,s[i]);break; //压入s[i]
case')':
case'}':
case']':if(match(Stack_Top(a),s[i]))
Stack_Pop(a);
else{
printf("NO\n");
flag=0;
break;
}
default:;
}
if(flag==0)break;
i++;
Stack_Print(a); //检查错误用的
}
if(Stack_IsEmpty(a))printf("YES\n%d",i); //i是检查错误用的
getch();
/********** End **********/
}
如图输入4 [(])也能通过,目的是符号配对,想知道哪里错了?
你这第二三四行就意义不明啊。。。你是不是想让if判断所有条件都成立?如果是的话,得用&&逻辑与,不能用逗号。
根据逗号表达式的语法,你的2、3、4行中写的a=='{'、a=='['、a=='('表达式都毫无意义(对if的判断毫无影响,也不产生任何赋值效果,换言之,除了无意义地损耗CPU性能外,这三个表达式跟不存在没有任何区别)。我建议你在进一步学习算法前再刷一刷语法基础的题目,不然debug会很麻烦。
====扩展阅读====
C/C++中的逗号表达式是一类特殊表达式,它仅仅有顺序执行一定语句的作用,表达式之间没有逻辑关系。
逗号表达式的值为逗号所连接的表达式中的最后一个表达式的值。
放在if中时,conditionA, conditionB这个逗号表达式的值只与conditionB的值有关。
辨析:假设有A,B两个布尔表达式:
A || B:表达式A一定会被求值。若A为真,整个表达式为真,B不会被求值(B含有的函数等不会被调用)(短路规则)。否则,B会继续被求值。
A && B:表达式A一定会被求值。若A为假,整个表达式为假,B不会被求值(短路规则)。否则,B会继续被求值。
A, B:A和B都会被求值(没有短路规则),且整个表达式的值只与B有关。
那个bool里面的if判断,应该是&&符号,不是逗号,逗号运算符的结果是最后一个逗号右边的值当做总体值