这是一个带有我的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++;
}
它应该起作用。