c语言编写一个算法,利用栈检查一个字符数组表示的字符中的花括号、方括号和圆括号是否配对,若能够全部配对则返回1,否则返回0。
时间: 2024-10-21 16:01:20 浏览: 19
设计一个算法判别一个算术表达式的圆括号是否正确配对
在 C 语言中,你可以通过构建一个栈数据结构来解决这个问题。这个过程通常被称为括号匹配算法。下面是一个基本的递归回溯算法示例:
```c
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
bool isValid(char *str) {
stack_t* s = (stack_t*)malloc(sizeof(stack_t));
int i;
char last = '\0'; // 初始化上次插入的是空字符
for(i = 0; str[i] != '\0'; i++) {
if(str[i] == '{' || str[i] == '[' || str[i] == '(') { // 遇到左括号入栈
push(s, str[i]);
} else if(last == '{' && str[i] == '}') { // 匹配左大括号和右大括号
pop(s);
if(isempty(s)) return true; // 如果此时栈为空,说明之前的所有括号都已配对
} else if(last == '[' && str[i] == ']') { // 同理处理其他类型的括号
pop(s);
if(isempty(s)) return true;
} else if(last == '(' && str[i] == ')') {
pop(s);
if(isempty(s)) return true;
} else {
return false; // 当前字符不是括号或无法匹配上一个括号,直接返回false
}
last = str[i]; // 更新last变量
}
// 检查剩余的括号是否能成对
while(!isempty(s)) {
return false;
}
free(s);
return true;
}
// Stack functions (not shown here)
void push(stack_t* s, char c) {}
char pop(stack_t* s) { return s->top; }
bool isempty(stack_t* s) { return s->top == -1; }
int main() {
char* test_strs[] = {"()", "({})", "([)]", "{[()()]}", "({[()])"};
int i;
for(i = 0; i < sizeof(test_strs) / sizeof(test_strs[0]); i++) {
printf("%s is %spaired.\n", test_strs[i], isValid(test_strs[i]) ? "" : "un");
// 示例字符串:"()" -> 1 (true), "({[})" -> 0 (false)
}
return 0;
}
```
这个程序创建了一个栈,遍历输入的字符串,如果遇到左括号就压入栈,遇到右括号就尝试弹出栈顶元素进行匹配。如果某个时刻栈为空,或者当前字符无法匹配之前的左括号,那么就返回 false。最后,如果栈为空,所有括号都已配对,返回 true。
阅读全文