2015-05-17 89 views
0
#include <iostream> 

using namespace std; 
/*Stack 
last in first out algorithm 
pop, push, print*/ 
class Node{ 
private: 
    int a; 
public: 
    Node *next; 
    Node(){ 
     next = NULL; 
    }; 
    Node(int b){ 
     int a = b; 
     next = NULL; 
    } 
    int getValue(); 
}; 

int Node::getValue(){ 
    return a; 
} 

class Stack{ 
    Node *top; 
public: 
    Node* pop(); 
    void push(int); 
    Stack(){ 
     top=NULL; 
    } 
    void printStack(); 
}aStack; 

//pushing onto the stack 
void Stack::push(int z){ 
    //if top is not null create a temp link it to top then set point top to temp 
    if (top != NULL){ 
     Node*temp = new Node(z); 
     temp->next = top; 
     top = temp; 
    } 
    else 
     //else just set the new node as top; 
     top = new Node(z); 
     top->next = NULL; 
} 

Node* Stack::pop(){ 
    if (top == NULL){ 
     cout << "Stack is empty" << endl; 
    } 
    else 
     //top = top->next; 
     return top; 
     //top = top->next; 
} 
//prints the stack 
void Stack::printStack(){ 
    int count = 0; 
    while(top!=NULL){ 
     count++; 
     cout << count << ": " << (*top).getValue() << endl; 
     top = top->next; 
    } 
} 

int main(){ 
    aStack.push(5); 
    aStack.printStack(); 
    //cout << aStack.pop()->getValue()<< endl; 
    cin.get(); 
} 

嘿傢伙,我正在審查我的數據結構。我無法弄清楚爲什麼在將空的堆棧上的數字5推出並打印出來後,我得到的輸出是0。請給我一個提示我做錯了,謝謝。C++堆棧實現意外輸出

+1

與你的問題沒有關係,但有兩個註釋:1.'pop'應該刪除頂部。使用temp變量保存top並將top移動到next,然後返回temp。 2.'printStack'不應該改變'top',再次使用temp變量來迭代堆棧。 – SHR

+0

感謝您的提示,我做了這些改變。 –

回答

4

Node::Node你是陰影的成員變量a

int a = b; 

通過

a = b; 

或更好的替代它,使用構造函數初始化列表

Node(int b): a(b), next(NULL){} 
+1

您的代碼還有一些其他小問題,例如'push'函數(在'else'子句中缺少大括號),以及在打印函數中修改'top',但嘗試使用調試器來確定發生了什麼。 – vsoftco

+0

好的,謝謝。 –

1

一個問題,我覺得在你的代碼中是你正在宣告另一個在類節點

Node(int b){ 
    //int a = b; when you define a new `a` variable, old one is ignored 
    a=b; 
    next = NULL; 
} 

a可變所有私有成員在類中定義的,因此,所有的類可以看到變量a。但是當你在一個子範圍中聲明一個新變量時,這個子範圍內的a變量在這個子範圍內被忽略