簡體   English   中英

如何在 C++ 中使用遞歸來反轉堆棧

[英]how to reverse a stack using recursion in C++

我試圖在不通過遞歸使用額外空間的情況下反轉堆棧。 但無法找到我的錯誤。

這是我的代碼。 它再次打印相同的堆棧。

#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;
}

你的遞歸不正確。 您刪除頂部,遞歸調用相同的函數(反向),然后將其推回頂部。 這不會改變它的位置! 這同樣適用於遞歸的所有元素:它們不會改變它們的位置。 對您的問題采用純遞歸解決方案(不使用其他堆棧或任何數據結構(如數組或列表))是不可能的。

您的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插入到棧底。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM