我自己的堆栈类中出现C++错误



这是一个带有我的Stack类的程序:

    #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

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

LB_4_RealStack.exe中0x00EE5FA9处未处理的异常:0xC0000005:读取位置0x00000000时发生访问冲突。

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

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

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

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

它应该起作用。

最新更新