假设一个算数表达式可以包舍三种括号:“(”,“)”方括号“[”,“]”及花括号“{“,“}”,且这三种括号可嵌套使用。没计算法判断给定表达式中所含括号是否配对出现,用c语言。
时间: 2023-10-27 12:06:10 浏览: 149
可以使用栈来进行括号匹配的判断,每当遇到左括号时将其入栈,每当遇到右括号时判断栈顶元素是否与此括号匹配,若匹配则将其出栈,否则说明括号不匹配。最终如果栈为空,则说明所有括号都匹配。以下是示例代码:
```
#include <stdio.h>
#include <stdbool.h>
#define MAX_LEN 100 //表达式最大长度
char exp[MAX_LEN]; //存储表达式的数组
typedef struct Stack { //定义栈结构体
int top;
char data[MAX_LEN];
} Stack;
void init(Stack *S) { //栈的初始化
S->top = -1;
}
bool is_empty(Stack *S) { //判断栈是否为空
return S->top == -1;
}
void push(Stack *S, char x) { //入栈操作
S->data[++(S->top)] = x;
}
char pop(Stack *S) { //出栈操作
return S->data[(S->top)--];
}
char get_top(Stack *S) { //获取栈顶元素
return S->data[S->top];
}
bool is_matching(char left, char right) { //判断左右括号是否匹配
return (left == '(' && right == ')') || (left == '[' && right == ']') || (left == '{' && right == '}');
}
bool check_brackets(char *exp) { //判断括号是否匹配
Stack S;
init(&S);
int i = 0;
while (exp[i]) {
if (exp[i] == '(' || exp[i] == '[' || exp[i] == '{') {
push(&S, exp[i]); //遇到左括号入栈
} else if (exp[i] == ')' || exp[i] == ']' || exp[i] == '}') {
if (is_empty(&S) || !is_matching(get_top(&S), exp[i])) {
return false; //遇到右括号栈为空或者左右括号不匹配则返回false
} else {
pop(&S); //左右括号匹配则出栈
}
}
i++;
}
return is_empty(&S); //如果栈为空则说明所有括号都匹配
}
int main() {
printf("请输入算数表达式:\n");
scanf("%s", exp);
if (check_brackets(exp)) {
printf("括号匹配\n");
} else {
printf("括号不匹配\n");
}
return 0;
}
```
阅读全文