试编写C程序,利用栈结构解决以下应用问题,输入一串括号包含以下括号种类:(、)、[、]、{、}。试利用顺序栈或链栈检查输入括号序列的匹配情况;
时间: 2024-10-12 15:04:49 浏览: 20
为了编写一个C程序,我们可以使用顺序栈(数组实现)来检查括号序列是否匹配。这里是一个简单的示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 定义栈结构体
typedef struct {
char* stack;
int top;
int size;
} Stack;
// 初始化栈
Stack* init_stack(int size) {
Stack* s = (Stack*) malloc(sizeof(Stack));
s->stack = (char*)malloc(size * sizeof(char));
s->top = -1;
s->size = size;
return s;
}
// 判断是否为空
bool is_empty(Stack* s) {
return s->top == -1;
}
// 入栈操作
void push(Stack* s, char c) {
if (s->top < s->size - 1) {
s->stack[++s->top] = c;
} else {
printf("Stack overflow!\n");
exit(EXIT_FAILURE);
}
}
// 出栈操作
char pop(Stack* s) {
if (is_empty(s)) {
printf("Stack underflow!\n");
exit(EXIT_FAILURE);
}
return s->stack[s->top--];
}
// 检查括号是否匹配
bool check_brackets(const char* brackets, char closing[], Stack* s) {
for (const char* p = brackets; *p != '\0'; ++p) {
if (*p == '[' || *p == '{' || *p == '(') {
push(s, *p);
} else {
if (is_empty(s)) {
return false;
}
char top = pop(s);
if ((top == '(' && *p != ')') ||
(top == '[' && *p != ']') ||
(top == '{' && *p != '}')) {
return false;
}
}
}
// 如果还有剩余的开括号,说明不匹配
if (!is_empty(s)) {
return false;
}
return true;
}
int main() {
const char* brackets = "()[]{}";
char closing[] = {')', ']', '}'};
Stack* s = init_stack(strlen(brackets) * 2);
if (check_brackets(brackets, closing, s)) {
printf("The bracket sequence is valid.\n");
} else {
printf("The bracket sequence is invalid.\n");
}
free(s->stack);
free(s);
return 0;
}
```
这个程序首先定义了一个栈数据结构,并实现了初始化、入栈、出栈以及检查括号匹配的功能。在`main`函数中,我们传入了给定的括号字符串和对应的关闭括号,然后调用`check_brackets`函数判断括号序列是否匹配。
阅读全文