2016-11-05 118 views
-2
struct Node{ 
    int value; 
    Node *next; 
    Node(int val) :value(val), next(nullptr){} 
}; 
class Stack 
{ 
public: 
    void push(int val); 
    int pop(); 
    bool is_empty(){ return first == nullptr; } 
private: 
    Node *first = nullptr; 
}; 

int Stack::pop(){ 
    int ret = first->value; 
    first = first->next; 
    return ret; 
} 
void Stack::push(int i){ 
    if (is_empty()){ 
     first = &Node(i); 
     return; 
    } 
    Node oldFirst = *first; 
    first = &Node(i); 
    first->next = &oldFirst; 
} 

这里是我写的代码,但是,有一个问题,当我完成push()first指针未指向正确的对象。我想知道如何解决这个问题。如何建立一个C++堆栈结构

+2

解决此类问题的正确工具是您的调试器。在*堆栈溢出问题之前,您应该逐行执行您的代码。如需更多帮助,请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您应该\编辑您的问题,以包含一个[最小,完整和可验证](http://stackoverflow.com/help/mcve)示例,该示例再现了您的问题,以及您在调试器。 –

+0

'std :: stack ' –

回答

3

表达&Node(i)创建临时对象,并给你一个指针。然后临时对象立即被破坏,留下一个指向不存在对象的指针。

您需要使用new来分配新的对象。

你也有类似的问题&oldFirst,它给你一个指向本地变量,一旦函数返回将被破坏。你需要使用一个指针变量。