2014-02-17 3 views
1

Я пишу код на C++ с контейнером, похожим на Stack.Возможно ли создать нерекурсивный деструктор в стеке, таком как контейнер?

class Stack { 
public: 
    int data; 
    Stack *next; 
    void push(); 
    void pop(); 
    ~Stack() { 
     delete next; 
    } 

}; 

Проблема в рекурсивном деструкторе. Если я нажимаю сотни тысяч элементов, деструктор падает до переполнения стека. Можно ли изменить его нерекурсивным способом?

+0

Да, повторите все узлы и добавьте их в 'std :: set'. после этого удалите только объекты из набора. – Raxvan

+2

Ваше определение класса является рекурсивным, имеющим 'Stack *' как член. Если стек должен быть реализован как связанный список, используйте узлы для этого. Или просто используйте 'std :: stack'. – JorenHeit

+0

Возможно, вы захотите иметь класс * StackRoot *. – Jarod42

ответ

0

Вы изначально создали «рекурсивный» класс. Хотя было бы лучше перепроектировать ваш класс и включить внутреннюю частную структуру, называемую, например, Node neverthelsee, этот код поможет вам избежать рекурсивных вызовов деструкторов для вашего исходного класса.

~Stack() 
{ 
    Stack *next = this->next; 
    while (next) 
    { 
     Stack *current = next; 
     next = next->next; 
     current->next = nullptr; 
     delete current; 
    } 
} 
+2

При удалении тока этот деструктор будет вызываться. – stefaanv

+2

@stefaanv Да, он будет вызываться, но, по крайней мере, не будет рекурсии, потому что current-> next имеет значение nullptr. –

+0

Тем не менее, это хрупкое решение, и в этом нужно помнить, что в этом случае должно быть найдено лучшее решение (разделение стека/узла). – stefaanv

4

Естественным решением является внутренняя структура Node, которая содержит фактические данные и связь. Затем класс Stack имеет указатель на первый узел в списке и может легко перебирать список для удаления каждого узла.

Смежные вопросы