我正在尝试学习数据结构,因此我做了一个练习,我们从用户那里读取一个字符串,然后我们评估该字符串,以检查括号是否格式正确,例如输入:
(()
,输出: no
,它们的格式不正确。尽管当我尝试运行我的代码时,它不仅给出了错误的输出,而且还向我显示了错误:free(): invalid pointer
。我用我的代码运行了 valgrind,它向我显示:Invalid free() ... Address.. is 12 bytes before a block of size 16 alloc´d
我将在下面发布我的代码片段。
我是初学者,所以任何帮助将不胜感激,我也乐于接受批评。
typedef struct {
int *v;
int cap;
int sz;
} stack;
stack *build() {
stack *new = (stack *)malloc(sizeof(stack));
new->v = (int *)malloc(sizeof(int) * 4);
new->cap = 4;
new->sz = 0;
return new;
}
int is_empty(stack *s) {
return s->sz == 0;
}
int push(stack *s, int e) {
int success = 1;
if (s->sz == s->cap) {
int *tmp = (int *)realloc(s->v, (s->cap + 1) * sizeof( int));
if ((success = tmp != NULL)) {
s->v = tmp;
++s->cap;
}
}
if (success) {
s->v[s->sz++] = e;
}
return success;
}
int top(stack *s) {
return *(s->v);
}
int pop(stack *s) {
int value;
if (is_empty(s))
return -1;
value = *(s->v);
s->v--;
s->sz--;
return value;
}
void destroy(stack *s) {
s->v -= s->sz + 1;
free(s->v);
free(s);
}
int match(char p1, char p2) {
if (p1 == '(')
return (p1 - p2) == '(' - ')';
else if (p1 == '[')
return (p1 - p2) == '[' - ']';
else
return (p1 - p2) == '{' - '}';
}
int main() {
int c;
stack *s = build();
while ((c = getchar()) != EOF && c != '\n') {
if (c == '(' || c == '[' || c == '{')
push(s, c);
else if (c == ')' || c == ']' || c == '}') {
if (!match(pop(s), c)) {
printf("no\n");
destroy(s);
return 0;
}
}
}
puts((is_empty(s)) ? "yes" : "no");
destroy(s);
return 0;
}