模板化堆栈链接列表

时间:2016-05-07 21:30:35

标签: stack

我已经为我必须完成的作业编写了模板堆栈链表。当我运行它时,它打印出第一个元素,但随后崩溃。什么可能出错?我觉得它可能是pop功能,但它是如此基本,我不确定甚至是什么错误。

template<typename T>
struct StackNode
{
    T data;
StackNode* next;
StackNode(T t, StackNode* ptr);
~StackNode();
};

template <typename T>
StackNode<T>::StackNode(T t, StackNode* ptr = nullptr)
:data(t), next(ptr)
{
}

template <typename T>
StackNode<T>::~StackNode()
{
delete next;
}





template<typename T>
struct LinkedStack 
{

    LinkedStack();
    LinkedStack(const StackNode<T> &s);
    ~LinkedStack();
    bool isEmpty();
    void push(const T& t);
    void pop();
    T top();

    StackNode<T>* head;
    int numElements;
};

template <typename T>
LinkedStack<T>::LinkedStack()
    : head(nullptr), numElements(0)
{
}

template<typename T>
LinkedStack<T>::LinkedStack(const StackNode<T> &s)
    : head(nullptr), numElements(0)
{
    for (auto t = s.head; t; t = t->next)
        push(t->item);
}

template<class T>
LinkedStack<T>::~LinkedStack()
{
    while (!isEmpty())
    {
        pop();
    }
}


template<typename T>
bool LinkedStack<T>::isEmpty()
{
    if (numElements > 0)
    {
        return false;
    }
    else
    {
        return true;
    }
}

template<typename T>
void LinkedStack<T>::push(const T& t)
{
    head = new StackNode<T>(t, head);
    numElements++;
}

template<typename T>
void LinkedStack<T>::pop()
{
    if (isEmpty())
    {
        cout << "Stack is empty." << endl;
    }
    else
    {
        StackNode<T>* oldnode = head;
        head = head->next;
        numElements--;
        delete oldnode;
    }
}

template<typename T>
T LinkedStack<T>::top()
{
    if (isEmpty())
    {
        cout << "Stack is empty..." << endl;
    }
    else
    {
        return head->data;
    }
}




int main() 
{
    LinkedStack<string> x;
    x.push("Test");
    x.push("One");
    x.push("Two");
    x.push("Three");
    cout << "Now popping all elements of the stack:" << endl;

    while (x.isEmpty() == false)
    {
        cout << x.top() << endl;
        x.pop();
    }
}

1 个答案:

答案 0 :(得分:0)

删除节点时,还会删除它指向的节点:

https://maps.googleapis.com/maps/api/staticmap?size=1024x512&path=weight:3|color:0x000000FF|enc:apeiH_h_M{H}LqFjJ_CkFsB_H}@mFUcG]qFm@mt@uM\&markers=shadow:false|icon:url|48.85777,2.2952&markers=48.86493,2.31033

当您弹出项目时,删除整个链接列表,因为删除从节点传播到另一个节点。删除最后一个节点后会引发段错误,程序会尝试删除 nullptr

pop 功能中的删除声明就足够了。无需删除Stacknode.next,因为您没有为其指定 new 关键字

删除有问题的删除后,我已成功运行您的代码。