我试图通过递归在不使用额外空间的情况下反转堆栈。但是找不到我的错误。
这是我的代码。它再次打印相同的堆栈。
#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;
}
发布于 2021-07-13 10:30:05
您的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
插入到堆栈的底部。
发布于 2021-07-13 10:02:45
您的递归性不正确。移除top,递归地调用相同的函数(reverse),然后将其推回到top。这不会改变它的位置!这同样适用于所有递归的元素:它们不会改变它们的位置。问题的纯递归解决方案(不使用另一个堆栈或任何数据结构,如数组或列表)是不可能的。
https://stackoverflow.com/questions/68360220
复制相似问题