帮我写一篇c语言程序要求1. 定义栈的存储结构,完成入栈、出栈、取栈顶、判断栈是否为空等基本操作的实现。 2. 实现括号匹配算法的实现。 3. 主函数完成括号匹配算法的调用,实现对给定的括号序列进行匹配,给出匹配结果。
时间: 2024-10-18 16:19:18 浏览: 41
C语言用栈实现十进制转换为二进制的方法示例
5星 · 资源好评率100%
在C语言中,我们可以使用数组或链表来实现一个简单的栈数据结构,并通过函数来完成相应的操作。这里我会提供一个基础的栈结构以及括号匹配算法的简单示例。
首先,我们创建一个栈结构,用动态内存分配实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_STACK_SIZE 100 // 栈的最大容量
typedef struct {
char *items; // 存储字符的指针
int top; // 栈顶指针
int size; // 栈的实际大小
} Stack;
Stack* create_stack() {
Stack* s = (Stack*)malloc(sizeof(Stack));
s->items = NULL;
s->top = -1;
s->size = 0;
return s;
}
// 入栈操作
void push(Stack* s, char item) {
if (s->size == MAX_STACK_SIZE) {
printf("Stack overflow.\n");
return;
}
s->items = realloc(s->items, sizeof(char) * (s->size + 2));
s->items[s->top + 1] = item;
s->top++;
}
// 出栈操作
char pop(Stack* s) {
if (s->top == -1) {
printf("Stack is empty.\n");
return '\0';
}
char item = s->items[s->top];
s->items[s->top] = '\0'; // 将最后一个元素置空以便释放空间
s->top--;
s->items = realloc(s->items, sizeof(char) * s->size);
return item;
}
// 判断栈是否为空
int is_empty(Stack* s) {
return s->top == -1;
}
// 获取栈顶元素,不改变栈的状态
char peek(Stack* s) {
if (is_empty(s)) return '\0';
return s->items[s->top];
}
```
接下来,我们可以编写一个辅助函数来检查括号匹配:
```c
// 检查括号是否匹配
int check_brackets(char stack[], int length) {
Stack* s = create_stack();
for (int i = 0; i < length; i++) {
if (stack[i] == '(' || stack[i] == '{' || stack[i] == '[') {
push(s, stack[i]);
} else if (stack[i] == ')' || stack[i] == '}' || stack[i] == ']') {
if (peek(s) == '\0' || peek(s) != stack[i - 1]) {
return 0; // 匹配失败
}
pop(s);
}
}
return !is_empty(s); // 如果栈为空,则表示所有括号都已匹配
}
```
主函数部分用于接收输入字符串并调用上述函数:
```c
int main() {
char brackets[] = "({[})"; // 测试字符串
int result = check_brackets(brackets, strlen(brackets));
if (result)
printf("The parentheses in the string are correctly matched.\n");
else
printf("The parentheses in the string are not correctly matched.\n");
return 0;
}
```
这个程序会检查输入的括号序列是否有效。如果你想让用户输入,可以修改`main()`函数来读取用户输入。注意,这个程序仅处理了最简单的括号类型,如圆括号、大括号和方括号。如果你需要处理更复杂的括号,比如花括号嵌套,那么需要调整括号匹配规则。
阅读全文