#include <stdio.h>
#include <stack> //top.栈顶----pop出栈----push入栈------isempty判空
using namespace std;
int main()
{
char ch;
int num;
int fact; //在这个地方,只定义了fact,却没有对其进行初始化,只要第一次改变了fact的值,那么他就变为1而且一直是1
scanf("%d",&num);///输入数字后要回车,回车后
getchar();///吸收键入数字后的\n
for(int i=0;i<num;i++){
stack <char> s;
scanf("%c",&ch);//输入字符
while(ch!='\n'){ //判断
switch(ch){
case '(':
s.push(ch);
break;
case '[':
s.push(ch);
break;
case ')':
if(s.empty()==true){
fact=1;
}
else if(s.top()=='('){
s.pop();
}
else
fact=1;
break;
case ']':
if(s.empty()==true){
fact=1;
}
else if(s.top()=='['){
s.pop();
}
else
fact=1;
break;
}
scanf("%c",&ch); //判断完第一个字符后,继续键入第二个字符
if(ch=='\n')
continue;//???????????????????//如果键入的字符是回车的话,说明一组数据输入完毕,那么while就可以结束了 //这句话是多余的,因为while会自己判断输入的是 //不是换行
}
if(s.empty()==false||fact==1) //while循环完毕,说明所有的字符全部输入并判断完成,如果栈为空,那么就是匹配
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}
今天脑袋很不清楚,所以暂时不想改这个代码了,先保存下,然后明天再看吧!
修改后的正确代码:
#include <iostream>
#include <stdio.h>
#include <stack> //top.栈顶----pop出栈----push入栈------isempty判空
using namespace std;
int main()
{
char ch;
int num;
int fact;
scanf("%d",&num);///输入数字后要回车,回车后
getchar();//吸收回车
for(int i=0;i<num;i++){ //代表测试数据的数量
stack <char> s;
fact=0;
scanf("%c",&ch);//输入字符
while(ch!='\n'){ //判断
switch(ch){
case '(':
s.push(ch);
break;
case '[':
s.push(ch);
break;
case ')':
if(s.empty()==true){
fact=1;
}
else if(s.top()=='('){
s.pop();//出栈
}
else
fact=1;
break;
case ']':
if(s.empty()==true){
fact=1;
}
else if(s.top()=='['){
s.pop();
}
else
fact=1;
break;
}
scanf("%c",&ch); //判断完第一个字符后,继续键入第二个字符
}
if(s.empty()==false||fact==1) //while循环完毕,说明所有的字符全部输入并判断完成,如果栈为空,那么就是匹配
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}