写数据结构(C语言)完整能运行的代码,要求:1. 定义栈的存储结构(顺序栈或者链栈均可)。 2. 在所定义的栈存储结构上实现栈的初始化、入栈、出栈、判断栈空以及查找栈顶等基本操作。 3. 基于栈基本操作的实现,设计主函数实现表达式中括号匹配问题的检验。
时间: 2024-10-21 09:07:26 浏览: 35
```c
#include <stdio.h>
#include <stdlib.h>
// 链表实现的栈结构
typedef struct Stack {
int* elements;
size_t top; // 栈顶指针
size_t capacity; // 栈的最大容量
} Stack;
// 初始化栈
void stack_init(Stack* s, size_t capacity) {
s->elements = (int*)malloc(capacity * sizeof(int));
s->top = -1;
s->capacity = capacity;
}
// 入栈
void push(Stack* s, int value) {
if (s->top == s->capacity - 1) {
printf("Stack is full.\n");
return;
}
s->top++;
s->elements[s->top] = value;
}
// 出栈
int pop(Stack* s) {
if (s->top == -1) {
printf("Stack is empty.\n");
return -1;
}
int value = s->elements[s->top];
s->top--;
return value;
}
// 判断栈是否为空
int is_empty(Stack* s) {
return s-1;
}
// 查找栈顶元素(查看但不移除)
int peek(Stack* s) {
if (is_empty(s)) {
printf("Stack is empty.\n");
return -1;
}
return s->elements[s->top];
}
// 检查表达式括号是否匹配的辅助函数
bool is_balanced(char* expr) {
Stack* s = (Stack*)malloc(sizeof(Stack));
stack_init(s, 50);
for (int i = 0; expr[i]; i++) {
if (expr[i] == '(')
push(s, i);
else if (expr[i] == ')') {
int opening_index = pop(s);
if (opening_index == -1 || expr[opening_index] != '(')
return false;
}
}
if (is_empty(s))
return true;
else
return false;
}
// 主函数演示使用
int main() {
char expr[] = "((()))";
if (is_balanced(expr)) {
printf("%s has balanced parentheses.\n", expr);
} else {
printf("%s does not have balanced parentheses.\n", expr);
}
free(s->elements); // 清理内存
free(s);
return 0;
}
```
阅读全文