习题地址:http://codeup.cn/problem.php?cid=100000605&pid=1
1.注意:
若操作符为[,(,{,则直接入栈
若操作符为 ],),},则要跟[,(,{匹配 ,易错
#include <cstdio>
#include <stack>
#include <string>
#include <iostream>
#include <stdlib.h>
using namespace std;
string str;
stack<char> s;
void judge(){
bool flag = true;
for(int i=0; i<str.length();i++){
if(flag == false) break; //若表达式非法,直接中止for循环
switch (str[i]){
case '(': //左括号直接入栈
s.push(str[i]);
break;
case '[':
s.push(str[i]);
break;
case '{':
s.push(str[i]);
break;
case ')':
if( !s.empty() && s.top() == '('){ //栈不空且匹配,先栈顶出栈
s.pop(); //注意:匹配是与 '(' ,此处易错!
break;
}else{ //若不匹配,则 表达式非法
flag = false;
break;
}
case ']':
if( !s.empty() && s.top() == '[' ){
s.pop();
break;
}else{
flag = false;
break;
}
case '}':
if( !s.empty() &&s.top() == '{'){
s.pop();
break;
}else{
flag = false;
break;
}
default : //若为其他则直接跳过
break;
}
}
if(!s.empty() || flag == false)
printf("no\n");
else
printf("yes\n");
}
int main(){
int n;
scanf("%d", &n);
while(n--){
str.clear(); //每次循环先清空str
while(!s.empty()) //清空栈
s.pop();
cin>>str;
judge();
}
return 0;
}