Description
题意描述:
在算术表达式中,除了加、减、乘、除等运算外,往往还有括号。包括有大括号{},中括号[],小括号(),尖括号<>等。
对于每一对括号,必须先左边括号,然后右边括号;如果有多个括号,则每种类型的左括号和右括号的个数必须相等;对于多重括号的情形,按运算规则,从外到内的括号嵌套顺序为:大括号->中括号->小括号->尖括号。例如,{[()]},{()},{{}}为一个合法的表达式,而([{}]),{([])},[{<>}]都是非法的。
Input
文件的第一行为一个整数n(1≤n≤100),接下来有n行仅由上述四类括号组成的括号表达式。第i+1行表示第i个表达式。每个括号表达式的长度不超过255。
Output
在输出文件中有N行,其中第I行对应第I个表达式的合法性,合法输出YES,非法输出NO。
Sample Input
5
{[(<>)]}
[()]
<>()[]{}
[{}]
{()}
Sample Output
YES
YES
YES
NO
YES
Source 对于每一对括号,必须先左边括号,然后右边括号;如果有多个括号,则每种类型的左括号和右括号的个数必须相等;对于多重括号的情形,按运算规则,从外到内的括号嵌套顺序为:大括号->中括号->小括号->尖括号。例如,{[()]},{()},{{}}为一个合法的表达式,而([{}]),{([])},[{<>}]都是非法的。
这个是到AC题目,这个题目要求括号要匹配,书本上只讲要求括号匹配就好了,比如{}{}[](),这样都是正确的匹配方式,而错误的匹配方式则是错误的:如{,}{,[]{],(}{)这样的都是错误的.
书上用栈做起来确实很方便,而且思路也比较好,利用栈的先进后出原理,把{[(<这样的形式压入栈,把}])>这样的取栈顶元素比较,相同则出栈,不同则不匹配.这样做起来确实明了,很好.
1.自己用数组也写了个,源码如下(只检查括号匹配,不检查优先级):
#include<stdio.h>
void main()
{
char arr[256];
int n,i,j,falt=0;
scanf("%d\n",&n);
while(n--){
gets(arr);
if(arr[0]=='}'||arr[0]==']'||arr[0]==')'||arr[0]=='>')
printf("NO\n");
else{
for(i=0;arr[i]!='\0';i++){
switch(arr[i]){
case '}': if(arr[i-1]=='{'){
for(j=i-1;arr[j]!='\0';j++){
arr[j]=arr[j+2];
}
i=i-2;
}
else{
falt=1;
goto ll;
}break;
case ']':if(arr[i-1]=='['){
for(j=i-1;arr[j]!='\0';j++){
arr[j]=arr[j+2];
}
i=i-2;
}
else{
falt=1;
goto ll;
}break;
case ')': if(arr[i-1]=='('){
for(j=i-1;arr[j]!='\0';j++){
arr[j]=arr[j+2];
}
i=i-2;
}
else{
falt=1;
goto ll;
}break;
case '>': if(arr[i-1]=='<'){
for(j=i-1;arr[j]!='\0';j++){
arr[j]=arr[j+2];
}
i=i-2;
}
else{
falt=1;
goto ll;
}break;
}
}//for
if(arr[0]=='\0'){
printf("YES\n");
}
else {
printf("NO\n");
}
}//else
ll:if(falt==1){
printf("NO\n");
falt=0;
}
}//while
}//main
2.这道题目正确的解,符合优先级考虑:
#include<stdio.h>
void main()
{
char arr[256];
int n,i,j,falt=0,k;
scanf("%d\n",&n);
while(n--){
gets(arr);
if(arr[0]=='}'||arr[0]==']'||arr[0]==')'||arr[0]=='>')
printf("NO\n");
else{
for(i=0;arr[i]!='\0';i++){
k=i;
switch(arr[i]){
case '}': while(k--){
if(arr[k]=='<' || arr[k]=='('|| arr[k]=='['){
falt=1;
goto ll;
}
}
if(arr[i-1]=='{'){
for(j=i-1;arr[j]!='\0';j++){
arr[j]=arr[j+2];
}
i=i-2;
}
else{
falt=1;
goto ll;
}break;
case ']':while(k--){
if(arr[k]=='<' || arr[k]=='('){
falt=1;
goto ll;
}
}
if(arr[i-1]=='['){
for(j=i-1;arr[j]!='\0';j++){
arr[j]=arr[j+2];
}
i=i-2;
}
else{
falt=1;
goto ll;
}break;
case ')':while(k--){
if(arr[k]=='<'){
falt=1;
goto ll;
}
}
if(arr[i-1]=='('){
for(j=i-1;arr[j]!='\0';j++){
arr[j]=arr[j+2];
}
i=i-2;
}
else{
falt=1;
goto ll;
}break;
case '>': if(arr[i-1]=='<'){
for(j=i-1;arr[j]!='\0';j++){
arr[j]=arr[j+2];
}
i=i-2;
}
else{
falt=1;
goto ll;
}break;
}
}
if(arr[0]=='\0'){
printf("YES\n");
}
else {
printf("NO\n");
}
}
ll:if(falt==1){
printf("NO\n");
falt=0;
}
}
}