题目要求如下:
这里要根据输入的字符串匹配其中每个表达式是否匹配,此时可以使用数据结构中的栈来解决。因为栈是先进后出的。
而这个问题的解决方法非常简单。当发现1个括号时将其压入栈中,而当发现对应的括号,弹出栈顶的元素,如果括号元素能够配对,那么继续读取下1个字符。否则直接就可以得出括号不匹配的结果。
举1个简单的例子,假设有如下的输入:
{ ( ) ]
当读取到第1个花括号{时,那么需要有1个对应的右花括号与之对应。而此时显然是不满足的,接着继续读取,发现左括号(,接着读取到右),那么正好配对1组。接着下1个符号为],而此时栈顶为{,显然是不满足的,此时就可以得到括号不匹配的结果。
下面是对应的代码:
#include <stdio.h>
#include <string.h>
typedef struct {
char s[3000];
int length;
} Stack;
int main(int argc, char const *argv[])
{
int n;
while(scanf("%d",&n)!=EOF){
char arr[3000] = {0};
for(int i=0;i< n;i++){
scanf("%s", arr);
//读入的字符串长度
int length = strlen(arr);
int need_continue = 0;
Stack stack = {0};
for(int j=0;j < length;j++){
if(arr[j]=='('){
//压栈
stack.s[stack.length++] = '(';
}else if(arr[j]=='['){
stack.s[stack.length++] = '[';
}else if(arr[j]=='{'){
stack.s[stack.length++] = '{';
}else if(arr[j]==')'){
//出栈
if(stack.s[stack.length-1] == '('){
need_continue = 1;
//弹出栈顶
stack.length--;
}else{
//左右括号不匹配,直接跳出
need_continue = 0;
break;
}
}else if(arr[j]==']'){
if(stack.s[stack.length-1] == '['){
need_continue = 1;
stack.length--;
}else{
need_continue = 0;
break;
}
}else if(arr[j]=='}'){
if(stack.s[stack.length-1] == '{'){
need_continue = 1;
stack.length--;
}else{
need_continue = 0;
break;
}
}
}
// 括号均配对
if(need_continue == 1){
printf("%s\n","yes");
}else{
printf("%s\n","no");
}
}
}
return 0;
}
最终通过后的结果:

本文介绍了一种使用栈实现括号匹配的算法。通过遍历输入字符串并利用栈的特性来判断括号是否正确配对,该算法适用于编程语言解析器和编辑器中的括号检查功能。
1172

被折叠的 条评论
为什么被折叠?



