括号匹配
/* 由题意可知这个题我们只关注三种括号即可 如果字符串是这样的{}((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"); } } }