2014-02-22 44 views
-3

我試圖實現堆棧包含字符串,我覺得我很接近現在 ,但我真的不知道爲什麼它不工作的堆疊

編輯: 類似的東西?我現在關門了嗎?

int pop(char **x) 
{ 
    if (isEmpty()) 
     return 0; 
    else 
    { 
     struct Node *temp = head; 
     *x = head->wyraz; 
     head = head->next; 
     free(temp); 
     return 1; 
    } 
} 


int main() 
{ 
char buf[255]; 
char *str; 
while (fgets(buf, sizeof(buf), stdin) != 0 && buf[0] != '\n') 
{ 

    push(buf); 
} 



while (pop(&str) != 0) 
{ 
    printf("%s\n", str); 
    free(str); 
} 

return 0; 
} 
+0

如果您想要查看代碼,那麼有關Stack Exchange的另一個討論就是爲此目的。如果你有特定的問題,請解釋它是什麼。 – keshlam

+3

你收到的答案很好,但下次你應該告訴我們什麼是「不工作」的含義。 –

回答

1

在您的insert()函數中,您不會創建字符串的副本,所以當讀取下一行時,它將覆蓋前一個字符串。因此,堆棧中的所有項目將以與讀取的最後一行相同的數據結束。您需要爲字符串分配內存並將輸入複製到分配的內存中。請記住允許尾隨空,並且fgets()保留讀取數據的換行符。

您使用從fgets()返回指向的數組的第零個元素的測試將在EOF上崩潰。循環條件應該是:

while (fgets(buf, sizeof(buf), stdin) != 0 && buf[0] != '\n') 
{ 
    … 

你應該測試你推到堆棧內的值被反覆彈出的數據,直到什麼都不剩打印。請記住要正確釋放數據。

您的pop()代碼有問題。您應該從編譯器獲得有關指向整數轉換的指示信息。您可能需要使用:

int pop(char **x) 
{ 
    if (isEmpty()) 
     return 0; 
    else 
    { 
     struct Node *temp = head; 
     *x = head->wyraz; 
     head = head->next; 
     free(temp); 
     return 1; 
    } 
} 

你不得不使用它像:

char *str; 

while (pop(&str) != 0) 
{ 
    printf("[%s]\n", str); 
    free(str); 
} 
2

,我看到的第一個主要問題是,你只是指針存儲到堆棧,並且總是設置爲buf不斷被改寫。

你應該得到strdup這個字符串,以確保每個節點獲得一個唯一的緩衝區(並且在彈出它之後的某個時刻記住free)。

1

有幾個問題:

  • 你總是使用相同的字符串緩衝區bufinsert
  • 你的pop函數有點困惑。我想你試圖返回一個指向堆棧頂部的字符串的指針,在這種情況下,你需要通過一個char **x而不是char *x。然後用指針pop(&p)來調用它。但很難說出你的意圖。

順便說一句,如果你想保持堆棧模式,我會把insert命名爲push