给定一个只包含()[]{}六种字符的字符串,请实现一个函数,判断字符串是否有效。有效条件如下:左括号必须使用相同类型的右括号闭合;左括号必须以正确的方式闭合;空字符串可被认为是有效字符串用c代码实现
时间: 2024-03-04 18:49:03 浏览: 91
可以使用栈来解决该问题。从左到右遍历字符串,如果遇到左括号,则将其入栈;如果遇到右括号,则将栈顶元素出栈并判断是否匹配,如果不匹配则返回0,如果遍历完字符串后栈为空,则返回1,否则返回0。具体实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 1000
int isValid(char* s) {
int len = strlen(s);
char* stack = (char*)malloc(sizeof(char) * (len + 1));
int top = -1;
for (int i = 0; i < len; i++) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
stack[++top] = s[i];
} else if (top >= 0 && ((s[i] == ')' && stack[top] == '(') || (s[i] == ']' && stack[top] == '[') || (s[i] == '}' && stack[top] == '{'))) {
top--;
} else {
free(stack);
return 0;
}
}
free(stack);
return top == -1;
}
int main() {
char str[MAX_LEN];
printf("请输入一个只包含()[]{}六种字符的字符串:\n");
scanf("%s", str);
if (isValid(str)) {
printf("字符串有效\n");
} else {
printf("字符串无效\n");
}
return 0;
}
```
其中,使用一个字符数组(stack)来模拟栈的操作。在遍历字符串时,如果遇到左括号,则将其入栈,如果遇到右括号,则将栈顶元素出栈并判断是否与该右括号匹配,如果不匹配则返回0。最后,如果遍历完字符串后栈为空,则说明字符串是有效的,返回1,否则返回0。
该算法的时间复杂度是O(n),其中n是字符串的长度,空间复杂度是O(n),其中n是字符串的长度。
阅读全文