1、从键盘输入一个仅包括(、)、[、]、{、}共6种字符的括号串,使用栈检查其合法性。如:[]{}、[{()}]合法;[]({}、 {[}]非法C语言
时间: 2024-01-11 14:03:19 浏览: 30
可以使用栈来检查括号串的合法性。具体步骤如下:
1. 定义一个栈,用于存储左括号;
2. 遍历括号串中的每一个字符,如果是左括号,则入栈;如果是右括号,则弹出栈顶元素并判断是否与当前右括号匹配,如果不匹配或栈为空,则说明括号串非法;
3. 如果遍历结束后栈为空,则说明括号串合法,否则说明括号串非法。
以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 100
// 定义栈结构体
typedef struct {
int top;
char data[MAX_SIZE];
} Stack;
// 初始化栈
void init(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
bool is_empty(Stack *s) {
return s->top == -1;
}
// 判断栈是否已满
bool is_full(Stack *s) {
return s->top == MAX_SIZE - 1;
}
// 入栈
void push(Stack *s, char ch) {
if (is_full(s)) {
fprintf(stderr, "stack is full\n");
exit(EXIT_FAILURE);
}
s->data[++(s->top)] = ch;
}
// 出栈
char pop(Stack *s) {
if (is_empty(s)) {
fprintf(stderr, "stack is empty\n");
exit(EXIT_FAILURE);
}
return s->data[(s->top)--];
}
// 检查括号串的合法性
bool check_valid(char *s) {
Stack stack;
init(&stack);
int i = 0;
while (s[i] != '\0') {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
push(&stack, s[i]);
} else if (s[i] == ')') {
if (is_empty(&stack) || pop(&stack) != '(') {
return false;
}
} else if (s[i] == ']') {
if (is_empty(&stack) || pop(&stack) != '[') {
return false;
}
} else if (s[i] == '}') {
if (is_empty(&stack) || pop(&stack) != '{') {
return false;
}
}
i++;
}
return is_empty(&stack);
}
int main() {
char s[MAX_SIZE];
printf("请输入括号串:");
scanf("%s", s);
if (check_valid(s)) {
printf("括号串合法\n");
} else {
printf("括号串非法\n");
}
return 0;
}
```
需要注意的是,以上代码仅适用于仅包括(、)、[、]、{、}共6种字符的括号串。如果括号串中包括其他字符,需要对代码进行相应修改。