弹出操作期间出错实现堆栈类

时间:2017-04-12 05:16:00

标签: c++ pointers stack

我正在尝试实现一个堆栈类,并且出于某种原因,当我尝试执行pop操作时,程序第二次崩溃。

我已经逐步完成调试器并发现当我在delete top函数中尝试pop时发生错误。

我已经玩了一个小时的大部分时间并没有运气。我正在对简单的整数值进行测试,因为该类是模板化的。 top仅仅是当前堆栈顶部的StackNode<T>*。我尝试通过创建临时指针并将其设置为等于top-&gt; next来修改它。

在我删除top之后,我尝试将top重置为temp指针,该指针应该指向数据结构中的下一个逻辑对象。

在函数的第二次迭代中,delete top抛出实际异常。

有什么想法吗?

int main()
{
    Stack<int> testStack;

    testStack.PushBack(5);
    testStack.PushBack(10);
    testStack.PushBack(12);
    testStack.PushBack(15);

    int testThisInt = testStack.pop();

    //BREAKS ON THIS CALL TO MEMBER FUNCTION POP
    int testThisSecondInt = testStack.pop();

    for (int x = 0; x < 10; x++)
        testStack.PushBack(x);

    testStack.Clear();

    cout << testThisInt << ' ' << testThisSecondInt << endl;

    if (testStack.IsEmpty())
        cout << "EMPTY WORKED!\n";

    return 0;

}

template <class T>
void Stack<T>::PushBack(T newData)
{
    StackNode<T>* newTemp = new StackNode<T>(newData);

    if (top != nullptr)
    {
        newTemp->next = top;
        top = newTemp;
    }
    else
        top = newTemp;
}

template <class T>
T Stack<T>::pop()
{
    StackNode<T>* temp = top->next;
    T dataTemp = top->data;

    delete top;

    top = temp;

    return dataTemp;
};

template <class T>
class Stack
{
    private:
        StackNode<T>* top;


    public:
        Stack(StackNode<T>* newTop = nullptr) : top(newTop) {};
        ~Stack() { this->Clear(); };
        T pop();
        T GetTop() const { return top->GetData; };
        void PushBack(T newData);
        void Clear();
        bool IsEmpty() { return top == nullptr; };
};
template <class T>
class StackNode
{
    private:
        StackNode<T>* next;
        T data;

    public:
        StackNode(T newData = T(), StackNode<T>* newNext = nullptr) : data(newData), next(newNext) {};
        ~StackNode() { delete next; next = nullptr; };
        T GetData() const { return data; };

        friend class Stack<T>;
};

0 个答案:

没有答案