7-2 括号匹配问题

给定一串字符,不超过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
#include

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;
}

你可能感兴趣的:(字符串,c语言,栈)