当我实现pop()和析构函数的堆栈持有节点,我应该删除node->数据之前删除节点本身或者我应该删除让创建节点 - >数据的调用者删除节点 - >数据?如果让主叫方这样做,主叫方何时以及如何删除数据?它应该以这种方式调用:{data = stack.top();删除数据; stack.pop();}?在哪里删除节点 - >日期在链接列表实现的堆栈
我还没有看到任何删除节点 - >数据的代码,既不在pop()的实现中,也不在调用者函数中。这就是我困惑的原因。
这里我复制我使用链接列表实现的堆栈。请参阅pop()和〜stack()我的问题的注释。谢谢你的帮助。
typedef struct Node_t{
struct Node_t* next;
void* data;
}Node;
class stack {
public:
stack(): _head(null), _size(0){}
~stack();
void push(void* data);
void pop();
void* top();
bool empty();
stack(const stack& original);
stack& operator=(const stack& original);
private:
Node* _head;
int _size;
};
stack::~stack{
Node* next = null;
while(_head){
next = _head->next;
//should delete _head->_data???
delete _head;
_head = next;
}
_size = 0;
}
void stack::push(void* data){
Node* elem = new Node;
elem->data = data;
elem->next = _head;
_head = elem;
_size++;
}
void stack::pop(){
Node* next = NULL;
if (_head) {
next = _head->next;
//should delete _head->_data???
delete _head;
_head = next;
_size--;
}
}
void* stack::top() const{
if (_head) {
return _head->_data;
}
}
bool stack::empty(){
if(_size>0) return false;
else return true;
}
+1:我同意这是基于现有的'push()'语义对'pop()'的一个好方法。尽管在引用语义可用的情况下,我不能立即想到一个例子,其中现有的'push()'注释是整个设计的最佳选择。 – Simon
谢谢你的例子。 – user389955