我自己的堆栈中的 C++ 错误 class

C++ Error in my own stack class

这是我的 Stack 的程序 class:

    #include <iostream>
    using namespace std;
    template <class T>
    struct Node{
        T element;
        Node<T> *prevElement;
    };

    template <class T>
    class Stack {
    private:
        unsigned int NumberOfElements;
        Node<T> *tempAdr;
        Node<T> *topElement;
    public:
        Stack(){
            topElement = new Node<T>;
            topElement->prevElement = nullptr;
            NumberOfElements = 0;
        }
        ~Stack(){
            delete topElement;
        }

        void push(T input_element){
            tempAdr = topElement->prevElement;
            topElement = new Node<T>;
            topElement->element = input_element;
            topElement->prevElement = tempAdr;
            NumberOfElements++;
        }

        void pop(){
            tempAdr = topElement->prevElement;
            delete topElement;
            topElement = tempAdr;
            NumberOfElements--;
        }

        T top(){
            return topElement->element;
        }

        unsigned int size(){
            return NumberOfElements;
        }

    };

    int main(){
        Stack<int> MyStack;
        MyStack.push(17);
        MyStack.push(18);
        MyStack.pop();
        cout << MyStack.top()<<" "<<MyStack.size();
        system("pause");
        return 0;
    }

预期输出为

17 1

但是当我 运行 代码时,我收到错误消息:

Unhandled exception at 0x00EE5FA9 in LB_4_RealStack.exe: 0xC0000005: Access violation reading location 0x00000000.

所以,你们能帮我找出错误吗?我一遍又一遍地查看我的代码,但没有找到异常的原因。

我认为错误出在您的 push() 方法中,即第一条指令。

实际上你在代码中获得的是将元素添加到从顶部开始的下一个元素的顶部(忽略当前顶部),所以如果你重写方法如下:

void push(T input_element){
    tempAdr = topElement;
    topElement = new Node<T>;
    topElement->element = input_element;
    topElement->prevElement = tempAdr;
    NumberOfElements++;
}

应该可以。