题目描述
现在给出一串字符串,里面的括号要不成双出现,要不就不出现,也就是括号匹配。括号的种类包括’{‘、’}‘、’(‘、’)‘、‘[’、‘]’。请大家判断字符串是否括号匹配,是则输出"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
总的来说:栈是有分优先级的,先进栈的优先级高,并且遵循先进后出的原则,比方说我们有一叠书,要拿出最后一本书(不能直接抽出最后一本书),我们只能将最上面的书一本接一本地拿走,这样才能拿到最后一本书。
因此我们可以用栈的性质来存放已经检测到的括号。
这里附上另一种情况的图解:
**
最后,随时欢迎小伙伴们对我任何文章产生疑问的都欢迎私信询问,或者有任何建议的都欢迎提出!!
**