2014-02-20 110 views
-1

我想在這裏實現使用鏈表棧類Stack類是我stack.h實現在C++

// File: Stack.h 

#ifndef STACK_H 
#define STACK_H 
class Stack 
{ 

private: 
    struct linklst{ 
     int num; 
     int* next; 
    }; 

    linklst* top; 

public: 
    Stack(); 
    ~Stack(); 

    void push(int i); 
    int pop(); 
    bool isempty(); 

}; 

#endif 

和我的籌碼的.cpp

// Stack.cpp 

#include"Stack.h" 
using namespace std; 

Stack::Stack(){ 
    top = new linklst(); 
    top->num = -1; 
    top->next = nullptr; 

}; 

Stack::~Stack() { 

    linklst * r = new linklst(); 
    while (true) 
    { 

     r = top; 
     top = top->next; 
     delete r; 


    } 

    delete top; 


}; 

void Stack::push(int i){ 

    linklst * r = new linklst(); 
    r->num = i; 
    r->next = top; 
    top = r; 


}; 

int Stack::pop(){ 

    if (!isempty){ 
     linklst * r = top; 
     top = top->next; 
     int x = r->num; 
     delete r; 
     return x; 

    } 


}; 

bool Stack::isempty(){ 

    return (top->next == nullptr); 

}; 

我的問題是在cpp文件,只要我嘗試將top分配給r,例如在推送函數中r-> next = top; 我得到這個錯誤「一個類型的值stack :: linllst *不能被分配給一個int *類型的實體」

有誰知道我在做什麼錯?

任何幫助,將不勝感激 感謝

+2

不應該'int * next;''linklst * next;'?鏈表中的節點應該指向下一個節點,而不是下一個節點包含的數據。 – Proxy

回答

1

總之,你的鏈接列表界面/數據結構稍微偏離不管棧的慾望。

更確切地說正是它說的問題是最大的問題:你的類定義不提供了一種方式插入linklistlinklist然而這是你在做什麼,而且相當正確我想補充。

在代碼的行top = top->next;您正試圖分配r,一個指向linklist *next,指針爲int。如上所述,意圖是正確的,定義是錯誤的。 next應該是指向linklist的指針。

struct linklst { 
    int num; // current payload 
    linklst* next; // pointer to the next linklst, NULL for EOL. (Not an int*) 
}; 

更新

欲瞭解更多信息和代碼中的其他問題,看看弗拉德的答案

+0

我將top定義爲指向鏈接列表的指針,如您在頭文件中所看到的。我看不到我把它定義爲一個int指針的位置 –

+0

是的,我有一個錯字,'頂部'應該說'下一個' – UpAndAdam

5

更改結構定義從

struct linklst{ 
    int num; 
    int* next; 
}; 

struct linklst{ 
    int num; 
    linklst* next; 
}; 

儘管如此,即使在更改後您的代碼也會出錯。例如,有在析構函數

Stack::~Stack() { 

    linklst * r = new linklst(); 
    while (true) 
    { 

     r = top; 
     top = top->next; 
     delete r; 


    } 

    delete top; 


}; 

內存泄漏首先,你分配新linklst併爲其分配地址於r但隨後在循環重新分配河 您的設計棧中還存在其他錯誤

例如,不需要在構造函數中分配「虛擬」頂端。我將定義構造函數如下方式

Stack::Stack() 
{ 
    top = NULL; // or nullptr 
} 

的AMD成員函數的isEmpty看上去就像

bool Stack::isempty() 
{ 
    return (top == nullptr); 
} 

而且成員函數的流行是未定義行爲,因爲它的情況下,沒有返回值時,堆棧爲空

int Stack::pop(){ 

    if (!isempty){ 
     linklst * r = top; 
     top = top->next; 
     int x = r->num; 
     delete r; 
     return x; 

    } 

}; 
+0

除了我們的共同答案之外,這還有很多其他優點 – UpAndAdam

+0

@UpAndAdam你工作在IBM? –

+0

@UpAndAdam我使用PL/X的面向對象功能爲IBM NFS Server寫了CTRACE記錄過濾。它是NFS服務器代碼中最好的代碼。:) –