本题实现求表达式中括号是否匹配。只需判断表达式中括号(本题中只会出现三种括号,分别是小括号,中括号和大括号)是否匹配,表达式中可以有其他值也可没有。 函数接口定义: int match (char *exp); 其中 exp 为需判断括号是否正确的表达式,返回值为1或0,如果为1,则表示括号匹配,0表示不匹配。
时间: 2023-06-16 22:08:12 浏览: 269
表达式括号匹配配对判断问题
4星 · 用户满意度95%
以下是一个简单的实现,利用栈来判断括号是否匹配:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 100
typedef struct {
char data[MAX_LEN];
int top;
} Stack;
void initStack(Stack *s) {
s->top = -1;
}
int isEmpty(Stack *s) {
return s->top == -1;
}
int isFull(Stack *s) {
return s->top == MAX_LEN - 1;
}
void push(Stack *s, char c) {
if (isFull(s)) {
fprintf(stderr, "stack is full\n");
exit(EXIT_FAILURE);
}
s->data[++s->top] = c;
}
char pop(Stack *s) {
if (isEmpty(s)) {
fprintf(stderr, "stack is empty\n");
exit(EXIT_FAILURE);
}
return s->data[s->top--];
}
int match(char *exp) {
Stack s;
initStack(&s);
int len = strlen(exp);
for (int i = 0; i < len; i++) {
char c = exp[i];
if (c == '(' || c == '[' || c == '{') {
push(&s, c);
} else if (c == ')' || c == ']' || c == '}') {
if (isEmpty(&s)) {
return 0;
}
char top = pop(&s);
if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {
return 0;
}
}
}
return isEmpty(&s);
}
int main() {
char exp[MAX_LEN];
printf("请输入表达式:");
fgets(exp, MAX_LEN, stdin);
exp[strcspn(exp, "\n")] = '\0'; // 去掉末尾的换行符
if (match(exp)) {
printf("括号匹配\n");
} else {
printf("括号不匹配\n");
}
return 0;
}
```
这里使用了一个结构体来实现栈,栈的元素类型是 char。在 match 函数中,遍历表达式中的字符,如果是左括号,则将其入栈;如果是右括号,则弹出栈顶元素,并判断是否与该右括号匹配。最后,判断栈是否为空,如果为空则表示括号匹配,否则括号不匹配。
阅读全文