字符串|7-2 括号匹配问题

给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。
输入格式: 输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点符号、空格。
输出格式: 如果括号配对,输出yes,否则输出no。
输入样例1: sin(10+20)
输出样例1: yes
输入样例2: 【字符串|7-2 括号匹配问题】{[}]
输出样例2: no
题解: 首先我们要读懂题干,这个题是要匹配括号,我们知道 :
1. ( ) 是匹配的,{ }和[ ]同理
2. ( } 是不匹配的,其余情况相同
3. ( { ) } 是不匹配的 因为这里的 ) 是要与最接近它的 左 括号进行匹配 也就是 “{” 很显然这两个符号不匹配,所以直接结束循环 打印 no (我们会发现 这个过程中我们并没有关心 “)” 后面的 “}” 是不是能找到匹配的对象,这一点很重要)
4. {() 是不匹配的 很显然左右括号数量不一致,无法做到所有括号成对匹配
好 那么我们可以开始设计流程了:
1.首先我们从字符串头部开始遍历:
只要没碰到右括号,我就一直往栈里塞左括号(当然前提是当前字符是左括号,若是其他字符的话就跳过本次循环,进入下一次)
2.然后,当我们碰到了右括号
(此时栈里的左括号们兴奋了起来,因为终于可以有右括号和他们进行配对了),
这时根据栈的性质,我们从栈顶取出(注意,是取出)一个左括号,然后与右括号进行配对,
如果配对成功(恭喜,左右嘉宾牵手成功),进入下一次循环;
如果配对失败(两人八字不合),那么直接打印no,结束程序
3.当我们结束了主循环,要回头看一下栈里是不是还有落单的左括号,
如果有,说明右括号不够用,直接输出no
如果栈空了,说明配对完成,输出yes

#include #includeint left(char c)//判断是不是左括号 { if(c=='('||c=='{'||c=='[') { return 1; } return 0; }int right(char c)//判断是不是右括号 { if(c==')'||c=='}'||c==']') { return 1; } return 0; }int check(char left,char right)//判断左右括号是否匹配 { if(left=='(') { return (right==')')?1:0; //如果相匹配返回1,否则返回0 } else if(left=='{') { return (right=='}')?1:0; } else return (right==']')?1:0; }int main(){ int i=0; char stack[200]; //存左括号们的栈 int top=0; //栈顶 char s[200]; //输入的字符串 gets(s); int l=strlen(s); for(i=0; i

    推荐阅读