Изучение нескольких методов обращения стека в C++

Обращение стека — распространенная операция в программировании, которая может быть полезна в различных сценариях. В этой статье мы рассмотрим несколько методов реверса стека в C++. Мы приведем примеры кода и обсудим плюсы и минусы каждого подхода.

Методы переворота стека:

  1. Использование вспомогательного стека:

    • Создайте вспомогательный стек.
    • Извлечь элементы из исходного стека и поместить их во вспомогательный стек.
    • Элементы во вспомогательном стеке будут перевернуты.
    • Извлеките элементы из вспомогательного стека и поместите их обратно в исходный стек.
    void reverseStack(stack<int>& originalStack) {
       stack<int> auxiliaryStack;
       while (!originalStack.empty()) {
           auxiliaryStack.push(originalStack.top());
           originalStack.pop();
       }
       while (!auxiliaryStack.empty()) {
           originalStack.push(auxiliaryStack.top());
           auxiliaryStack.pop();
       }
    }
  2. Использование рекурсии:

    • Извлечь верхний элемент из стека.
    • Рекурсивно перевернуть оставшийся стек.
    • Вставьте выдвинутый элемент внизу перевернутой стопки.
    void insertAtBottom(stack<int>& st, int element) {
       if (st.empty()) {
           st.push(element);
           return;
       }
       int temp = st.top();
       st.pop();
       insertAtBottom(st, element);
       st.push(temp);
    }
    void reverseStack(stack<int>& st) {
       if (!st.empty()) {
           int top = st.top();
           st.pop();
           reverseStack(st);
           insertAtBottom(st, top);
       }
    }
  3. Использование вектора:

    • Преобразуйте стек в вектор.
    • Переверните вектор, используя функцию reverse()из библиотеки .
    • Очистить исходную стопку.
    • Поместите элементы из перевернутого вектора обратно в стек.
    void reverseStack(stack<int>& originalStack) {
       vector<int> tempVector;
       while (!originalStack.empty()) {
           tempVector.push_back(originalStack.top());
           originalStack.pop();
       }
       reverse(tempVector.begin(), tempVector.end());
       for (int element : tempVector) {
           originalStack.push(element);
       }
    }