2016-11-20 4 views
-3

В следующей функции. Я попытался использовать стек и реализовать с использованием массивов. Я сделал создание стека, push, pop, функции. Но при компиляции он показывает ошибку. пожалуйста, помогите мне выяснить, в чем проблема?Какая ошибка в коде?

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

struct stack_struct { 
    char a[100]; 
    int top; 
}; 

typedef struct stack_struct *stack; 

stack charc; 

stack createstack() { 
    stack s = (stack) malloc(sizeof(struct stack_struct)); 
    s->top = -1;//initialize the stack 
    return s; 
} 

void push(stack s, char x) { 
    s->top++; 
    s->a[s->top] = x; 
} 

char pop(stack s) { 
    assert(s->top > 0); 
    char x; 
    x = s->a[s->top]; 
    s->top--; 
    return x; 
} 

void printstack(stack s) { 
    while (s->top != -1) { 
     printf("%c", s->a[s->top]); 
     s-> top--; 
    } 


void main() { 
    charc = createstack();  
    push(charc, 3); 
    printstack(charc); 
    pop(charc); 
    printstack(charc); 
    push(charc, 4); 
    printstack(charc); 
    push(charc, 5); 
    printstack(charc); 
    push(charc, 6); 
    printstack(charc); 
    push(charc, 7); 
    printstack(charc); 
} 
} 
+1

Что такое ошибка и номер строки? –

+0

Возможно, не связаны, но вы не должны набрасывать 'malloc' – UnholySheep

+0

Скрывающие указатели с' typedef' являются склонными к ошибкам, считаются плохой практикой, затрудняют чтение кода ... – chqrlie

ответ

3

У вас не хватает } в конце printstack функции и имеют один дополнительный } в конце кода. Добавьте отсутствующий и удалите лишний, и он скомпилируется. Кроме того, ваша главная функция должна возвращать Int (int main() вместо void main()), и вы должны return 0; от вашей основной функции

+0

Я узнал, что возвращает 0; в конце концов не требуется. и даже после этого (что вы мне сказали) он показывает поп; Функция assert не работает. – 4rshdeep

+0

Это потому, что функция printstack эффективно опустошает ваш стек, поэтому 's-> top' установлен на -1. Assert терпит неудачу, потому что 's-> top' не больше, чем' 0'. И хотя ваша программа будет компилироваться с помощью 'void main()', вы не должны этого делать, правильным способом является 'int main()' или 'int main (int argc, char * argv [])'. –

1

Есть действительно проблемы в вашем коде:

  • Существует недостающее } в конце определение функции для printstack

  • поскольку у вас есть дополнительный } в конце файла, после определения main() и так gcc позволяет местный FUNC , сообщение об ошибке, вероятно, очень сложно интерпретировать.

  • Утверждение в pop должно читать assert(s->top >= 0);, поскольку s->top == 0 указывает стек с одним элементом.

  • Прототипом для main должен быть либо int main(void), либо int main(int argc, char *argv[]) или его эквивалент. Возврат 0 в конце main() является необязательным в C99 и позже, но считается хорошим.

  • Отбрасывание возвращаемого значения malloc() не является необходимым и может скрыть некоторые проблемы, если вы опускаете включить <stdlib.h>, не делайте этого в коде C.

  • Скрывающие указатели позади typedef s не рекомендуется, это делает код более трудным для чтения, и это часто приводит к ошибкам программирования. A stack - объект, не указатель на объект. Использование неявных указателей делает разницу менее очевидной и создает путаницу.

  • printstack не следует изменять stack, он должен использовать локальную переменную:

    void printstack(const struct stack_struct *s) { 
        for (int i = s->top; i >= 0; i--) { 
         printf("%c", s->a[i]); 
        } 
        printf("\n"); 
    } 
    
  • Использование глобальных переменных не требуется для кода, сделать charc локальной по отношению к функции main и free его перед выходом из программа.

  • Тип элемента стека должен быть int вместо char, так как вы нажимаете числа на стек.

Вот упрощенная версия:

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

typedef struct stack { 
    int a[100]; 
    int top; 
} stack; 

stack *createstack(void) { 
    stack *s = malloc(sizeof(*s)); 
    s->top = -1; // initialize the stack as empty 
    return s; 
} 

void push(stack *s, int x) { 
    s->a[++s->top] = x; 
} 

int pop(stack *s) { 
    assert(s->top >= 0); 
    return s->a[s->top--]; 
} 

void printstack(const stack *s) { 
    for (int i = s->top; i >= 0; i--) { 
     printf("%d ", s->a[i]); 
    } 
    printf("\n"); 
} 

int main(void) { 
    stack *st = createstack(); 

    push(st, 3); 
    printstack(st); 
    pop(st); 
    printstack(st); 
    push(st, 4); 
    printstack(st); 
    push(st, 5); 
    printstack(st); 
    push(st, 6); 
    printstack(st); 
    push(st, 7); 
    printstack(st); 

    free(st); 
    return 0; 
} 
+0

сэр, он не показывает целые числа, что я должен делать? @chqrlie – 4rshdeep

+0

@pottersher: я обновил ответ с некоторыми исправлениями и использовал 'int' в качестве типа элемента, чтобы сделать содержимое стека пригодным для печати. – chqrlie

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