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