2016-11-20 182 views
-3

在下面的函数中。我尝试使用堆栈和实现使用数组。我做了创建堆栈,推,弹出,功能。但编译时显示错误。请帮我弄清楚问题是什么?代码中的错误是什么?

#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;在最后没有必要。甚至在做完这些之后(你告诉我的)它显示出流行音乐;断言功能失败。 – 4rshdeep

+0

这是因为你的printstack函数有效地清空你的堆栈,所以's-> top'被设置为-1。断言失败,因为'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在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