【详细图解】【基础题—栈的应用】括号匹配(C语言)

题目描述
现在给出一串字符串,里面的括号要不成双出现,要不就不出现,也就是括号匹配。括号的种类包括’{‘、’}‘、’(‘、’)‘、‘[’、‘]’。请大家判断字符串是否括号匹配,是则输出"Yes",反之输出"No"。字符串长度不大于100。

输入
abc(abc)
输出
Yes
输入
abv(aa
输出
No

题目分析:
我们可以用栈的思想来实现这段代码。首先我们观察到,只有先输入左括号后,再在后续输入对应的右括号这样才能匹配。那么我们可以认为把先输入的左括号存放在栈里,由于栈是从下往上堆叠而成的,所以把最先输入的左括号压在栈底,这样一步步地堆叠上去。
那么关键的点在于:我们可以建立一个char型的stack数组当作栈,来存放输入的括号,之后设置一个is_match变量(用来标记找没找到匹配的括号,如果有等于1,如果没有等于0),最初让它等于1,表示找到了匹配的括号。

题解:

#include <stdio.h>
#include <string.h>
int main(void) {
	char s[1000], stack[1000];
	scanf("%s", s);//输入括号或字符
	int len = strlen(s), i = 0, top = 0, is_match = 1;
	for (i = 0; i < len; i++) {
		if (s[i] == '[' || s[i] == '(' || s[i]=='{') {
			stack[top++] = s[i];//这里用来存放左括号
		}
		else if (s[i] == ']') {
			if (top > 0 && stack[top - 1] == '[') {
				top--;//如果有左括号存在并且上一个是'['
			}//top--的意思是我们已经找到了匹配的括号了,把已经匹配了的括号给消除,相当于退出了栈
			else {
				is_match = 0;//如果没找到,就将它设为0
				break;
			}
		}
		else if (s[i] == '}') {//以下同理
			if (top > 0 && stack[top - 1] == '{') {
				top--;
			}
			else {
				is_match = 0;
				break;
			}
		}
		else if (s[i] == ')') {
			if (top > 0 && stack[top - 1] == '(') {
				top--;
			}
			else {
				is_match = 0;
				break;
			}
		}
	}
	if (is_match && top == 0) {//最后如果全部括号都匹配成功的话,top就会等于0,也就是栈里什么东西也没有了,清空了,然后is_match的状态当然要是1
		printf("Yes\n");
	}
	else {
		printf("No\n");
	}
	return 0;
}

图解
以下是我们对本题栈的原理的图解
画的粗糙,不要介意,hhhhh
在这里插入图片描述总的来说:栈是有分优先级的,先进栈的优先级高,并且遵循先进后出的原则,比方说我们有一叠书,要拿出最后一本书(不能直接抽出最后一本书),我们只能将最上面的书一本接一本地拿走,这样才能拿到最后一本书。
因此我们可以用栈的性质来存放已经检测到的括号。

这里附上另一种情况的图解:
在这里插入图片描述

**

最后,随时欢迎小伙伴们对我任何文章产生疑问的都欢迎私信询问,或者有任何建议的都欢迎提出!!

**

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值