2015-12-09 3 views
0

Я реализовал Stack с использованием динамического массива (использование удвоения массива), но когда дублирование происходит во второй раз, я получаю ошибку времени выполнения! Что происходит с реализацией? Пожалуйста помоги.Реализация стека с использованием динамического массива

#include <stdio.h> 
#include <stdlib.h> 

struct Stack { 
    int *arr; 
    int top,size,capacity; 
}; 

struct Stack *createStack(int capacity) { 
    struct Stack *s = (struct Stack*)malloc(sizeof(struct Stack)); 
    s->arr = (int*)malloc(sizeof(int)*capacity); 
    s->top = -1; 
    s->capacity = capacity; 
    s->size = 0; 
    return s; 
} 

void doubleStack(struct Stack *s) { 
    s->capacity = s->capacity*2; 
    s->arr = realloc(s->arr,s->capacity); 
    printf("Array doubling happened successfully!\n"); 
} 

int isFull(struct Stack *s) { 
    return s->size == s->capacity; 
} 

void push(struct Stack *s, int item) { 
    if(isFull(s)) 
     doubleStack(s); 

    printf("%d pushed!\n",item); 
    s->arr[++(s->top)] = item; 
    s->size++; 
} 

int isEmpty(struct Stack *s) { 
    return s->size == 0; 
} 

void pop(struct Stack *s) { 
    if(isEmpty(s)) { 
     printf("Empty stack!\n"); 
     return; 
    } 

    int item = s->arr[(s->top)--]; 
    s->size--; 
    printf("%d popped!\n",item); 
} 

int main(void) { 
    struct Stack *s = createStack(2); 
    push(s,1); 
    push(s,2); 
    push(s,3); 
    push(s,4); 
    push(s,5); 
    pop(s); 
    pop(s); 
    return 0; 
} 
+0

Примечание: они говорят, что [вы не должны случае результат 'таНос()' в C] (http://stackoverflow.com/questions/605845/делать-и-бросок-на-результат-в-таНос). – MikeCAT

+1

'printf (« удвоение массива произошло успешно! \ N »);' без проверки того, был ли 'realloc()' успешным? Бред какой то. – MikeCAT

+0

Это не предназначалось для проверки успешного распределения памяти, но для того, чтобы сказать, что раз в два раза повторялось удвоение массива! Я ценю помощь, но смотрю жаргон! –

ответ

2

Вы смогли умножить размер, чтобы выделить с помощью realloc() по sizeof(int).

Попробуйте это с некоторыми другими улучшения:

#include <stdio.h> 
#include <stdlib.h> 

struct Stack { 
    int *arr; 
    int top,size,capacity; 
}; 

struct Stack *createStack(int capacity) { 
    struct Stack *s = malloc(sizeof(struct Stack)); 
    s->arr = malloc(sizeof(int)*capacity); 
    s->top = -1; 
    s->capacity = capacity; 
    s->size = 0; 
    return s; 
} 

void destroyStack(struct Stack *s) { 
    if(s != NULL) free(s->arr); 
    free(s); 
} 

void doubleStack(struct Stack *s) { 
    s->capacity = s->capacity*2; 
    s->arr = realloc(s->arr,sizeof(int)*s->capacity); 
    if(s->arr != NULL) { 
     printf("Array doubling happened successfully!\n"); 
    } else { 
     perror("realloc"); 
    } 
} 

int isFull(struct Stack *s) { 
    return s->size == s->capacity; 
} 

void push(struct Stack *s, int item) { 
    if(isFull(s)) 
     doubleStack(s); 

    printf("%d pushed!\n",item); 
    s->arr[++(s->top)] = item; 
    s->size++; 
} 

int isEmpty(struct Stack *s) { 
    return s->size == 0; 
} 

void pop(struct Stack *s) { 
    if(isEmpty(s)) { 
     printf("Empty stack!\n"); 
     return; 
    } 

    int item = s->arr[(s->top)--]; 
    s->size--; 
    printf("%d popped!\n",item); 
} 

int main(void) { 
    struct Stack *s = createStack(2); 
    push(s,1); 
    push(s,2); 
    push(s,3); 
    push(s,4); 
    push(s,5); 
    pop(s); 
    pop(s); 
    destroyStack(s); 
    return 0; 
} 
+0

Спасибо за быстрый ответ, его работа. У меня есть вопрос, почему это порождает ошибку для второго удвоения ошибки, а не в первый раз? –

Смежные вопросы