写出利用栈实现检查一段C语言代码,看其中的括号是否是匹配的程序的代码
时间: 2024-11-20 10:44:41 浏览: 16
要编写一个栈来检查C语言代码中的括号是否匹配,你可以创建一个`Stack`数据结构,然后遍历输入的字符串,对于每个遇到的字符,根据其类型进行操作:
```c
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
// 定义栈的数据结构,仅包含一个字符数组和两个指针
typedef struct {
char stack[100]; // 假设最多有100个括号
int top; // 栈顶指针
} Stack;
// 初始化栈
void init(Stack *s) {
s->top = -1;
}
// 判断字符是否为括号,并入栈
bool push(Stack *s, char c) {
if (s->top == sizeof(s->stack) - 1) {
printf("Stack overflow!\n");
return false;
}
s->stack[++s->top] = c;
return true;
}
// 出栈并判断是否为匹配括号,非括号直接返回true
bool pop(Stack *s, bool is_left_bracket) {
if (s->top == -1) {
return false;
}
char popped_char = s->stack[s->top--];
if (!is_left_bracket && popped_char != ')' || is_left_bracket && popped_char != '(') {
return true; // 非括号对,直接返回true
} else {
return !push(s, popped_char); // 如果是左括号,需要继续出栈检查匹配
}
}
// 检查括号是否匹配
bool checkBrackets(const char *code) {
Stack brackets;
init(&brackets);
for (int i = 0; code[i]; ++i) {
char c = code[i];
if (c == '(' || c == '{' || c == '[') {
if (!push(&brackets, c)) {
return false;
}
} else if (c == ')' || c == '}' || c == ']') {
bool matched = pop(&brackets, c == '(');
if (!matched) {
return false;
}
}
}
// 检查栈是否为空,如果为空表示所有括号都已匹配
return brackets.top == -1;
}
int main() {
const char *test_cases[] = {"()", "({})", "[]{}}", "({[})", "HelloWorld"};
size_t test_count = sizeof(test_cases) / sizeof(*test_cases);
for (size_t i = 0; i < test_count; ++i) {
bool result = checkBrackets(test_cases[i]);
if (result) {
printf("%s: OK\n", test_cases[i]);
} else {
printf("%s: NOT MATCHED\n", test_cases[i]);
}
}
return 0;
}
```
这个程序通过栈来跟踪遇到的括号,对于每一对左右括号,它会先压入左括号到栈中,遇到右括号时则尝试从栈中弹出并检查是否匹配。如果在处理完整个字符串后栈为空,则说明所有括号都是匹配的。
阅读全文