如何在 C++ 中使用递归来反转堆栈

时间:2021-07-13 09:55:04

标签: c++ recursion

我试图在不通过递归使用额外空间的情况下反转堆栈。但是找不到我的错误。

这是我的代码。它再次打印相同的堆栈。

#include<iostream>
#include<stack>
using namespace std;
void insert( stack<int>& k , int j){
    k.push(j);
}
void reverse(stack<int> &s){
    if(s.empty()){
        return;
    }
    int temp = s.top();
    s.pop();
    reverse(s);
    insert(s,temp);
}
int main()
{   
    stack<int>s;
    for( int i = 5;i>0;i--){
        s.push(i);
    }
    reverse(s);
    while(!s.empty()){
       cout << s.top() << " ";
       s.pop();
    }   
    return 0;
}

2 个答案:

答案 0 :(得分:0)

您的递归性不正确。您删除顶部,递归调用相同的函数(反向),然后将其推回顶部。这不会改变它的位置!这同样适用于递归的所有元素:它们不会改变它们的位置。对您的问题采用纯递归解决方案(不使用其他堆栈或任何数据结构,如数组或列表)是不可能的。

答案 1 :(得分:0)

您的 insert() 函数不正确,因为您只将 temp 推入堆栈,一旦堆栈为空,temp 的值将为 5,因此推入 5,然后推入 4,依此类推。因此堆栈以相同的顺序填充。这 insert() 应该可以工作。

void insert( stack<int>& k , int j){
    if(k.empty()){
        k.push(j);
        return;
    }
    int temp = k.top();
    k.pop();
    insert(k, j);
    k.push(temp);
}

insert() 只是将 j 插入到栈底。