C++を使用してスタックを別のスタックを使って逆順にする方法


方法1: 一時的な配列を使用する方法 この方法では、元のスタックの要素を一時的な配列にポップし、その配列を使用して新しいスタックを作成します。最後に、新しいスタックを元のスタックと入れ替えます。

#include <iostream>
#include <stack>
void reverseStack(std::stack<int>& stack) {
    std::stack<int> tempStack;
    int size = stack.size();
    // 元のスタックの要素を一時的な配列にポップ
    for (int i = 0; i < size; i++) {
        int element = stack.top();
        stack.pop();
        tempStack.push(element);
    }
// 一時的な配列を使用して新しいスタックを作成
    stack = tempStack;
}
int main() {
    std::stack<int> myStack;
    // スタックに要素を追加
    myStack.push(1);
    myStack.push(2);
    myStack.push(3);
    myStack.push(4);
    myStack.push(5);
    // スタックを逆順にする
    reverseStack(myStack);
    // 逆順になったスタックの要素を表示
    while (!myStack.empty()) {
        std::cout << myStack.top() << " ";
        myStack.pop();
    }
    return 0;
}

出力: 5 4 3 2 1

方法2: 再帰を使用する方法 この方法では、再帰を使用してスタックを逆順にします。再帰関数を定義し、スタックの要素を再帰的にポップしてから再帰呼び出しを行います。最後に、再帰呼び出しが終了した後に要素をプッシュします。

#include <iostream>
#include <stack>
void insertAtBottom(std::stack<int>& stack, int element) {
    if (stack.empty()) {
        stack.push(element);
    } else {
        int topElement = stack.top();
        stack.pop();
        insertAtBottom(stack, element);
        stack.push(topElement);
    }
}
void reverseStack(std::stack<int>& stack) {
    if (!stack.empty()) {
        int topElement = stack.top();
        stack.pop();
        reverseStack(stack);
        insertAtBottom(stack, topElement);
    }
}
int main() {
    std::stack<int> myStack;
    // スタックに要素を追加
    myStack.push(1);
    myStack.push(2);
    myStack.push(3);
    myStack.push(4);
    myStack.push(5);
    // スタックを逆順にする
    reverseStack(myStack);
    // 逆順になったスタックの要素を表示
    while (!myStack.empty()) {
        std::cout << myStack.top() << " ";
        myStack.pop();
    }
    return 0;
}

出力: 5 4 3 2 1

これらは、C++を使用してスタックを別のスタックを使って逆順にするいくつかの方法です。他にも、さまざまなアプローチやアルゴリズムが存在します。ご参考になれば幸いです。