括号匹配

/*
由题意可知这个题我们只关注三种括号即可
如果字符串是这样的{}((SK* )()),那么可以去掉其他字符变成这样——{}(()())
为了方便描述,每个字符的对应位置如下
0 1 2 3 4 5 6 7
{ } ( ( ) ( ) )
那么模拟一下代码流程,一共有八个字符,将分成八个步骤来讲解。
0、我们首先遇到的是'{’
此时栈当中没有元素,可知左括号是无法与其他括号匹配的,所以将‘{’塞入栈当中,此时栈的元素有一个——‘{’,此时栈的内容是这样的【‘{’】。
1、第二个字符为‘}’,
我们可以知道的是右括号可以与左括号匹配,而字符'}'可以匹配的字符是'{'。此时可以看到的是栈尾元素是'{',那么这两个括号是可以匹配的,就像消消乐一样,我们可以将其消除掉,此时栈的内容是这样的【】,什么都没有
2、遇到括号'(',与0步骤一样,将其填入栈中,栈内容是这样的【'('】
3、同上,栈内容为【'(','('】
4、遇到括号')',可以看到栈尾元素为'(',消除,栈内容变为【'('】
5、同步骤2,栈内容变为【'(','('】
6、遇到')',栈尾元素为‘(',消除,栈内容变为【'('】
7、遇到')',栈尾元素为‘(',消除,栈内容变为【】
最后我们可以看到栈内容为空,说明所有括号都匹配上了,输出yes
*/
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
    cout<<(0x70)<<endl;
    char str[1050];
    while(gets(str)){
        char stack[1004];
        int num = 0;
        for (int i = 0; str[i]; i++){
            if(str[i] == ')'){              //当前元素为’)'
                if(num > 0 && stack[num-1] == '('){//栈不为空,并且栈尾元素为'('
                    num --;                            //可以匹配,将栈尾元素消除
                }else stack[num ++] = str[i];//否则说明无法匹配,将此字符压入栈中
            }
            if(str[i] == ']'){              //当前元素为’]'
                if(num > 0 && stack[num-1] == '['){//栈不为空,并且栈尾元素为'['
                    num --;                            //可以匹配,将栈尾元素消除
                }else stack[num ++] = str[i];//否则说明无法匹配,将此字符压入栈中
            }
            if(str[i] == '}'){              //思路同上
                if(num > 0 && stack[num-1] == '{'){
                    num --;
                }else stack[num ++] = str[i];
            }
            if(str[i] == '(' || str[i] == '[' || str[i] == '{'){//遇到左括号则直接将其压入栈中
                stack[num ++] = str[i];
               }
        }
        if(num == 0){               //栈的内容为空,说明所有括号都已经匹配上了
            printf("yes\n");
        }else {                     //栈内容不为空,说明右括号没有匹配到
            printf("no\n");
        }
    }
}
View Code

相关文章: