用c语言编写给出一个字符串,字符串中只有(、)、[、]、{、}六种字符。要求判断字符串中的括号是否合法匹配。
时间: 2024-05-09 21:18:56 浏览: 53
可以使用栈来实现括号匹配的判断。遍历字符串中的每一个字符,如果是左括号,则将其入栈;如果是右括号,则将栈顶元素出栈,判断是否与该右括号匹配。如果匹配,则继续遍历下一个字符;如果不匹配,则说明括号不合法,直接返回false。遍历完所有字符后,如果栈为空,则说明括号合法,返回true;否则说明还有未匹配的左括号,返回false。
以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define MAX_SIZE 100
// 栈的结构体定义
typedef struct {
char data[MAX_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
bool isEmpty(Stack *s) {
return s->top == -1;
}
// 判断栈是否已满
bool isFull(Stack *s) {
return s->top == MAX_SIZE - 1;
}
// 入栈
bool push(Stack *s, char c) {
if (isFull(s)) {
return false;
}
s->top++;
s->data[s->top] = c;
return true;
}
// 出栈
bool pop(Stack *s) {
if (isEmpty(s)) {
return false;
}
s->top--;
return true;
}
// 获取栈顶元素
char getTop(Stack *s) {
if (isEmpty(s)) {
return '\0';
}
return s->data[s->top];
}
// 判断括号是否匹配
bool isMatch(char left, char right) {
if (left == '(' && right == ')') {
return true;
}
if (left == '[' && right == ']') {
return true;
}
if (left == '{' && right == '}') {
return true;
}
return false;
}
// 判断字符串中的括号是否合法匹配
bool isValid(char *s) {
Stack stack;
initStack(&stack);
int len = strlen(s);
for (int i = 0; i < len; i++) {
char c = s[i];
if (c == '(' || c == '[' || c == '{') {
push(&stack, c);
} else if (c == ')' || c == ']' || c == '}') {
char top = getTop(&stack);
if (!isMatch(top, c)) {
return false;
}
pop(&stack);
}
}
return isEmpty(&stack);
}
int main() {
char s[] = "{()[()]}";
if (isValid(s)) {
printf("括号合法!\n");
} else {
printf("括号不合法!\n");
}
return 0;
}
```
阅读全文