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

时间:2015-03-22 18:51:49

标签: c++ exception stack

这是我的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。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

它应该有用。