當我實現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