7-1 括号匹配 (25分)

给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。
输入格式:
输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点符号、空格。

输出格式:

如果括号配对,输出yes,否则输出no。

输入样例1:

sin(10+20)

输出样例1:

yes

输入样例2:

{[}]

输出样例2:

no

利用堆栈,遇到左符号压栈,遇到右符号则检查栈顶。若栈为空,或栈顶符号不匹配(栈顶必须是对应的左符号,也不能是其他右符号),则说明失配。最后还要检查一下栈是否为空,若栈不空则说明存在左符号失配,结果也不匹配。

#include<stdio.h>
#include<string.h>

int main()
{
	char string[101];
	scanf("%[^\n]",string);
	int lenth=strlen(string);
	int i;
	char stack[100];
	int top=-1; 
	for(i=0;i<lenth;i++)
	{
		if(string[i]=='('||string[i]=='['||string[i]=='{')
		{
			stack[++top]=string[i];
		}
		else if(string[i]==')'||string[i]==']'||string[i]=='}')
		{
			if((top!=-1)&&((string[i]==')'&&stack[top]=='(')||(string[i]==']'&&stack[top]=='[')||(string[i]=='}'&&stack[top]=='{')))
			{
			//栈必须非空,且栈顶符号为当前右符号的匹配的左符号
				top--;
			}
			else
			break;
		} 
	}
	//flag==1说明右符号均匹配成功
	int flag;
	if(i<lenth)
	flag=0;
	else
	flag=1;
	//top==-1,最后栈空,则说明左符号均匹配成功
	if(flag&&top==-1)
	printf("yes\n");
	else
	printf("no\n");
	
	return 0;
} 
可以使用栈来判断一个包含空格的表达式括号是否匹配。具体步骤如下: 1. 创建一个空栈。 2. 遍历表达式中的每个字符,如果遇到左括号(包括空格),则将其压入栈中。 3. 如果遇到右括号(包括空格),则从栈中弹出一个元素,如果弹出的元素是对应的左括号,则表达式括号匹配,直接返回 false。 4. 如果遍历完表达式后,栈中还有元素,则表达式括号匹配,直接返回 false。 5. 如果遍历完表达式后,栈中没有元素,则表达式括号匹配,返回 true。 示例: 假设表达式为:(a + b) * (c + d) / (e + f) 1. 遇到左括号 (,将其压入栈中。 2. 遇到字母 a,做处理。 3. 遇到空格,做处理。 4. 遇到加号 +,做处理。 5. 遇到字母 b,做处理。 6. 遇到右括号 ),从栈中弹出一个元素,发现是左括号 (,匹配成功。 7. 遇到空格,做处理。 8. 遇到乘号 *,做处理。 9. 遇到空格,做处理。 10. 遇到左括号 (,将其压入栈中。 11. 遇到字母 c,做处理。 12. 遇到空格,做处理。 13. 遇到加号 +,做处理。 14. 遇到字母 d,做处理。 15. 遇到右括号 ),从栈中弹出一个元素,发现是左括号 (,匹配成功。 16. 遇到空格,做处理。 17. 遇到除号 /,做处理。 18. 遇到空格,做处理。 19. 遇到左括号 (,将其压入栈中。 20. 遇到字母 e,做处理。 21. 遇到空格,做处理。 22. 遇到加号 +,做处理。 23. 遇到字母 f,做处理。 24. 遇到右括号 ),从栈中弹出一个元素,发现是左括号 (,匹配成功。 25. 遍历完表达式,栈中没有元素,表达式括号匹配,返回 true。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值