2016-11-20 117 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